diff options
Diffstat (limited to 'tqtinterface/qt4/src/tools')
120 files changed, 0 insertions, 81496 deletions
diff --git a/tqtinterface/qt4/src/tools/qfeatures.txt b/tqtinterface/qt4/src/tools/qfeatures.txt deleted file mode 100644 index 857e71e..0000000 --- a/tqtinterface/qt4/src/tools/qfeatures.txt +++ /dev/null @@ -1,1314 +0,0 @@ -Feature: WORKSPACE -Section: Widgets -Requires: SCROLLBAR VBOX TITLEBAR RESIZEHANDLER POPUPMENU LABEL TOOLBUTTON MAINWINDOW TOOLBAR MENUBAR -Name: QWorkSpace -SeeAlso: ??? - -Feature: WHEELEVENT -Section: Kernel -Requires: -Name: Wheel-mouse events -SeeAlso: ??? - -Feature: WMATRIX -Section: Data structures -Requires: -Name: QWMatrix -SeeAlso: ??? - -Feature: STL -Section: Data structures -Requires: -Name: Standard template library compatiblity -SeeAlso: ??? - -Feature: CANVAS -Section: Widgets -Requires: SCROLLVIEW BEZIER -Name: QCanvas -SeeAlso: ??? - -Feature: TOOLBOX -Section: Widgets -Requires: ICONSET SCROLLVIEW TOOLTIP LAYOUT TOOLBUTTON -Name: Tool box -SeeAlso: ??? - - -Feature: TABLE -Section: Widgets -Requires: COMBOBOX HEADER CHECKBOX -Name: QTable -SeeAlso: ??? - -Feature: XML -Section: Data structures -Requires: TEXTSTREAM TEXTCODEC REGEXP_CAPTURE -Name: XML -SeeAlso: ??? - -Feature: SQL -Section: Database -Requires: STRINGLIST REGEXP_CAPTURE VARIANT SPRINTF DATESTRING -Name: SQL classes -SeeAlso: ??? - -Feature: SQL_FORM -Section: Database -Requires: SQL PROPERTIES -Name: QSqlForm -SeeAlso: ??? - -Feature: SQL_EDIT_WIDGETS -Section: Database -Requires: SQL SPINBOX COMBOBOX CHECKBOX DATETIMEEDIT -Name: SQL value editor widgets -SeeAlso: ??? - -Feature: SQL_VIEW_WIDGETS -Section: Database -Requires: SQL_FORM SQL_EDIT_WIDGETS TABLE -Name: SQL table widgets -SeeAlso: ??? - -Feature: STRINGLIST -Section: Data structures -Requires: -Name: QStringList -SeeAlso: ??? - -Feature: REGEXP -Section: Data structures -Requires: -Name: Regular expression capture -SeeAlso: ??? - -Feature: REGEXP_CAPTURE -Section: Data structures -Requires: REGEXP STRINGLIST -Name: Regular expression capture -SeeAlso: ??? - -Feature: TEMPLATE_VARIANT -Section: Data structures -Requires: VARIANT STRINGLIST -Name: Template classes in QVariant -SeeAlso: ??? - -Feature: VARIANT -Section: Data structures -Requires: -Name: QVariant -SeeAlso: ??? - -Feature: REGEXP_OPTIM -Section: Data structures -Requires: REGEXP -Name: Regular expression optimization -SeeAlso: ??? - -Feature: REGEXP_LOOKAHEAD -Section: Data structures -Requires: REGEXP -Name: Regular expression lookahead -SeeAlso: ??? - -Feature: REGEXP_INTERVAL -Section: Data structures -Requires: REGEXP -Name: Regular expression interval -SeeAlso: ??? - -Feature: REGEXP_ESCAPE -Section: Data structures -Requires: REGEXP -Name: Regular expression escape -SeeAlso: ??? - -Feature: REGEXP_CCLASS -Section: Data structures -Requires: REGEXP -Name: Regular expression character-class -SeeAlso: ??? - -Feature: REGEXP_BACKREF -Section: Data structures -Requires: REGEXP -Name: Regular expression back-reference -SeeAlso: ??? - -Feature: REGEXP_ANCHOR_ALT -Section: Data structures -Requires: REGEXP -Name: Regular expression anchors -SeeAlso: ??? - -Feature: REGEXP_WILDCARD -Section: Data structures -Requires: REGEXP -Name: Regular expression wildcard -SeeAlso: ??? - -Feature: SPRINTF -Section: Data structures -Requires: REGEXP -Name: QString::sprintf() -SeeAlso: ??? - -Feature: QUUID_STRING -Section: Data structures -Requires: STRINGLIST -Name: Convert UUID to/from string -SeeAlso: ??? - -Feature: TEXTDATE -Section: Data structures -Requires: STRINGLIST DATESTRING -Name: Month and day names in dates -SeeAlso: ??? - -Feature: DATESTRING -Section: Data structures -Requires: -Name: QDate/QTime/QDateTime toString() and fromString() -SeeAlso: ??? - -Feature: ICONSET -Section: Images -Requires: IMAGEIO IMAGE_SMOOTHSCALE PALETTE IMAGE_HEURISTIC_MASK -Name: QIconSet -SeeAlso: ??? - -Feature: DIR -Section: File I/O -Requires: STRINGLIST REGEXP -Name: QDir -SeeAlso: ??? - -Feature: PALETTE -Section: Kernel -Requires: -Name: Palettes -SeeAlso: ??? - -Feature: TEXTSTREAM -Section: File I/O -Requires: -Name: QTextStream -SeeAlso: ??? - -Feature: DATASTREAM -Section: File I/O -Requires: -Name: QDataStream -SeeAlso: ??? - -Feature: LIBRARY -Section: File I/O -Requires: REGEXP -Name: Shared library wrapper -SeeAlso: ??? - -Feature: COMPONENT -Section: File I/O -Requires: QUUID_STRING SETTINGS SPRINTF LIBRARY DATESTRING -Name: Dynamic module linking -SeeAlso: ??? - -Feature: SETTINGS -Section: File I/O -Requires: DIR TEXTSTREAM REGEXP_CAPTURE -Name: Persistent application settings -SeeAlso: ??? - -Feature: SIGNALMAPPER -Section: Widgets -Requires: -Name: QSignalMapper -SeeAlso: ??? - -Feature: IMAGEIO -Section: Images -Requires: REGEXP -Name: Image formats -SeeAlso: ??? - -Feature: IMAGEIO_BMP -Section: Images -Requires: IMAGEIO DATASTREAM -Name: BMP image I/O -SeeAlso: ??? - -Feature: IMAGEIO_PPM -Section: Images -Requires: IMAGEIO -Name: PPM image I/O -SeeAlso: ??? - -Feature: IMAGEIO_XBM -Section: Images -Requires: IMAGEIO -Name: XBM image I/O -SeeAlso: ??? - -Feature: IMAGEIO_XPM -Section: Images -Requires: IMAGEIO SPRINTF TEXTSTREAM -Name: XPM image I/O -SeeAlso: ??? - -Feature: IMAGEIO_PNG -Section: Images -Requires: IMAGEIO -Name: PNG image I/O -SeeAlso: ??? - -Feature: IMAGEIO_MNG -Section: Images -Requires: IMAGEIO -Name: MNG image I/O -SeeAlso: ??? - -Feature: IMAGEIO_JPEG -Section: Images -Requires: IMAGEIO -Name: JPEG image I/O -SeeAlso: ??? - -Feature: ASYNC_IO -Section: Images -Requires: -Name: Asynchronous I/O -SeeAlso: ??? - -Feature: ASYNC_IMAGE_IO -Section: Images -Requires: IMAGEIO -Name: Asynchronous image I/O -SeeAlso: ??? - -Feature: MOVIE -Section: Images -Requires: ASYNC_IO ASYNC_IMAGE_IO -Name: Animated images -SeeAlso: ??? - -Feature: FREETYPE -Section: Fonts -Requires: -Name: Freetype font engine -SeeAlso: ??? - -Feature: BDF -Section: Fonts -Requires: TEXTSTREAM STRINGLIST -Name: BDF font files -SeeAlso: ??? - -Feature: FONTDATABASE -Section: Fonts -Requires: STRINGLIST -Name: QFontDatabase -SeeAlso: ??? - -Feature: TRANSLATION -Section: Internationalization -Requires: DATASTREAM -Name: Translations via TQT_BASE_OBJECT_NAME::tr() -SeeAlso: ??? - -Feature: TRANSLATION_UTF8 -Section: Internationalization -Requires: TRANSLATION TEXTCODEC -Name: Translations via TQT_BASE_OBJECT_NAME::trUtf8() -SeeAlso: ??? - -Feature: TEXTCODEC -Section: Internationalization -Requires: -Name: Character set conversions -SeeAlso: ??? - -Feature: CODECS -Section: Internationalization -Requires: TEXTCODEC -Name: Non-Unicode text conversions -SeeAlso: ??? - -Feature: BIG_CODECS -Section: Internationalization -Requires: CODEC_HEBREW -Name: Big Codecs (eg. CJK) -SeeAlso: ??? - -Feature: CODEC_HEBREW -Section: Internationalization -Requires: CODECS COMPLEXTEXT -Name: Hebrew Codec -SeeAlso: ??? - -Feature: UNICODETABLES -Section: Internationalization -Requires: -Name: Unicode property tables -SeeAlso: ??? - -Feature: MIME -Section: File I/O -Requires: DIR IMAGEIO TEXTCODEC -Name: MIME -SeeAlso: ??? - -Feature: RICHTEXT -Section: Widgets -Requires: STYLE LAYOUT STRINGLIST TEXTSTREAM -Name: RichText (HTML) display -SeeAlso: ??? - -Feature: TEXTCUSTOMITEM -Section: Widgets -Requires: RICHTEXT MIME -Name: RichText (HTML) tables and images -SeeAlso: ??? - - -Feature: COMPLEXTEXT -Section: Internationalization -Requires: RICHTEXT -Name: Complex scripts (eg. BiDi) -SeeAlso: ??? - -Feature: DOM -Section: File I/O -Requires: XML MIME -Name: Document Object Model -SeeAlso: ??? - -Feature: SOUND -Section: Kernel -Requires: -Name: Playing sounds -SeeAlso: ??? - -Feature: QWS_SOUNDSERVER -Section: Qt/Embedded-specific -Requires: SOUND DIR DNS -Name: Server to play sound -SeeAlso: ??? - -Feature: PROPERTIES -Section: Kernel -Requires: VARIANT STRINGLIST ICONSET -Name: Properties -SeeAlso: ??? - -Feature: NETWORK -Section: Networking -Requires: -Name: Networking -SeeAlso: ??? - -Feature: DNS -Section: Networking -Requires: NETWORK STRINGLIST TEXTSTREAM SPRINTF -Name: DNS -SeeAlso: ??? - -Feature: URL -Section: Networking -Requires: DIR -Name: URL parser -SeeAlso: ??? - -Feature: NETWORKPROTOCOL -Section: Networking -Requires: TEXTCODEC URL -Name: Network file access -SeeAlso: ??? - -Feature: NETWORKPROTOCOL_FTP -Section: Networking -Requires: NETWORKPROTOCOL DNS TEXTDATE -Name: FTP file access -SeeAlso: ??? - -Feature: NETWORKPROTOCOL_HTTP -Section: Networking -Requires: NETWORKPROTOCOL DNS -Name: HTTP file access -SeeAlso: ??? - -Feature: PROCESS -Section: File I/O -Requires: STRINGLIST REGEXP -Name: External process invocation. -SeeAlso: ??? - -Feature: QWS_MULTIPROCESS -Section: Qt/Embedded-specific -Requires: NETWORK -Name: Multi-process architecture -SeeAlso: ??? - -Feature: COP -Section: Networking -Requires: DATASTREAM -Name: QCop IPC -SeeAlso: ??? - -Feature: QWS_KEYBOARD -Section: Qt/Embedded-specific -Requires: -Name: Console keyboard -SeeAlso: ??? - -Feature: QWS_KBD_SL5000 -Section: Qt/Embedded-specific -Requires: QWS_KEYBOARD -Name: Keyboard for SHARP Zaurus SL5xxx tqdevices -SeeAlso: ??? - -Feature: QWS_CURSOR -Section: Qt/Embedded-specific -Requires: CURSOR -Name: Visible cursor -SeeAlso: ??? - -Feature: QWS_ALPHA_CURSOR -Section: Qt/Embedded-specific -Requires: -Name: Alpha-blended cursor -SeeAlso: ??? - -Feature: QWS_MACH64 -Section: Qt/Embedded-specific -Requires: -Name: Mach64 acceleration -SeeAlso: ??? - -Feature: QWS_VOODOO3 -Section: Qt/Embedded-specific -Requires: -Name: Voodoo3 acceleration -SeeAlso: ??? - -Feature: QWS_MATROX -Section: Qt/Embedded-specific -Requires: -Name: Matrox MGA acceleration -SeeAlso: ??? - -Feature: QWS_REPEATER -Section: Qt/Embedded-specific -Requires: -Name: Repeater display -SeeAlso: ??? - -Feature: QWS_VFB -Section: Qt/Embedded-specific -Requires: -Name: Virtual frame buffer -SeeAlso: ??? - -Feature: QWS_TRANSFORMED -Section: Qt/Embedded-specific -Requires: QWS_LINUXFB -Name: Transformed frame buffer -SeeAlso: ??? - -Feature: QWS_LINUXFB -Section: Qt/Embedded-specific -Requires: -Name: Linux framebuffer -SeeAlso: ??? - -Feature: QWS_VNC -Section: Qt/Embedded-specific -Requires: NETWORK -Name: Remote frame buffer (VNC) -SeeAlso: ??? - -Feature: QWS_SHADOWFB -Section: Qt/Embedded-specific -Requires: -Name: Shadow frame buffer -SeeAlso: ??? - -Feature: QWS_DEPTH_1 -Section: Qt/Embedded-specific -Requires: -Name: 1-bit monochrome -SeeAlso: ??? - -Feature: QWS_DEPTH_4 -Section: Qt/Embedded-specific -Requires: -Name: 4-bit grayscale -SeeAlso: ??? - -Feature: QWS_VGA_16 -Section: Qt/Embedded-specific -Requires: -Name: 4-bit VGA -SeeAlso: ??? - -Feature: QWS_DEPTH_8GRAYSCALE -Section: Qt/Embedded-specific -Requires: -Name: 8-bit grayscale -SeeAlso: ??? - -Feature: QWS_DEPTH_8 -Section: Qt/Embedded-specific -Requires: -Name: 8-bit color -SeeAlso: ??? - -Feature: QWS_DEPTH_16 -Section: Qt/Embedded-specific -Requires: -Name: 15 or 16-bit color -SeeAlso: ??? - -Feature: QWS_DEPTH_24 -Section: Qt/Embedded-specific -Requires: -Name: 24-bit color -SeeAlso: ??? - -Feature: QWS_DEPTH_32 -Section: Qt/Embedded-specific -Requires: -Name: 32-bit color -SeeAlso: ??? - -Feature: QWS_DEPTH_32_BGR -Section: Qt/Embedded-specific -Requires: QWS_DEPTH_32 -Name: 32-bit color, BGR order -SeeAlso: ??? - -Feature: QWS_MANAGER -Section: Qt/Embedded-specific -Requires: -Name: Window Manager -SeeAlso: ??? - -Feature: QWS_KDE2_WM_STYLE -Section: Qt/Embedded-specific -Requires: QWS_MANAGER -Name: The "KDE2" style -SeeAlso: ??? - -Feature: QWS_HYDRO_WM_STYLE -Section: Qt/Embedded-specific -Requires: QWS_MANAGER -Name: The "Hydro" style -SeeAlso: ??? - -Feature: QWS_BEOS_WM_STYLE -Section: Qt/Embedded-specific -Requires: QWS_MANAGER -Name: The "BeOS" style -SeeAlso: ??? - -Feature: QWS_KDE_WM_STYLE -Section: Qt/Embedded-specific -Requires: QWS_MANAGER -Name: The "KDE" style -SeeAlso: ??? - -Feature: QWS_WINDOWS_WM_STYLE -Section: Qt/Embedded-specific -Requires: QWS_MANAGER -Name: The "Windows" style -SeeAlso: ??? - -Feature: QWS_MOUSE_AUTO -Section: Qt/Embedded-specific -Requires: -Name: Autodetecting mouse driver -SeeAlso: ??? - -Feature: QWS_MOUSE_MANUAL -Section: Qt/Embedded-specific -Requires: -Name: Non-autodetecting mouse driver -SeeAlso: ??? - -Feature: QWS_SAVEFONTS -Section: Qt/Embedded-specific -Requires: -Name: Saving of fonts -SeeAlso: ??? - -Feature: QWS_GFX_SPEED -Section: Qt/Embedded-specific -Requires: -Name: Favour code size over graphics speed -SeeAlso: ??? - -Feature: QWS_PROPERTIES -Section: Qt/Embedded-specific -Requires: -Name: Qt/Embedded window system properties. -SeeAlso: ??? - -Feature: CLIPBOARD -Section: Kernel -Requires: QWS_PROPERTIES MIME -Name: Cut and paste -SeeAlso: ??? - -Feature: DRAGANDDROP -Section: Kernel -Requires: MIME QWS_PROPERTIES IMAGEIO_XPM -Name: Drag and drop -SeeAlso: ??? - -Feature: MIMECLIPBOARD -Section: Kernel -Requires: CLIPBOARD -Name: Cut and paste non-text -SeeAlso: ??? - -Feature: DRAWUTIL -Section: Kernel -Requires: SPRINTF PALETTE -Name: Drawing utility functions -SeeAlso: ??? - -Feature: IMAGE_TRUECOLOR -Section: Images -Requires: -Name: TrueColor QImage -SeeAlso: ??? - -Feature: IMAGE_SMOOTHSCALE -Section: Images -Requires: -Name: Smooth QImage scaling -SeeAlso: ??? - -Feature: IMAGE_DITHER_TO_1 -Section: Images -Requires: -Name: Dither QImage to 1-bit image -SeeAlso: ??? - -Feature: IMAGE_HEURISTIC_MASK -Section: Images -Requires: -Name: QImage::createHeuristicMask() -SeeAlso: ??? - -Feature: IMAGE_MIRROR -Section: Images -Requires: -Name: QImage mirroring -SeeAlso: ??? - -Feature: IMAGE_TEXT -Section: Images -Requires: STRINGLIST -Name: Image file text strings -SeeAlso: ??? - -Feature: IMAGE_16_BIT -Section: Qt/Embedded-specific -Requires: IMAGE_TRUECOLOR -Name: 16-bit QImage -SeeAlso: ??? - -Feature: CURSOR -Section: Kernel -Requires: -Name: Cursors -SeeAlso: ??? - -Feature: COLORNAMES -Section: Painting -Requires: -Name: Named colors -SeeAlso: ??? - -Feature: TRANSFORMATIONS -Section: Painting -Requires: WMATRIX -Name: Scaling and rotation -SeeAlso: ??? - -Feature: PIXMAP_TRANSFORMATION -Section: Painting -Requires: WMATRIX -Name: Pixmap transformations -SeeAlso: ??? - -Feature: IMAGE_TRANSFORMATION -Section: Painting -Requires: PIXMAP_TRANSFORMATION -Name: Image transformations -SeeAlso: ??? - -Feature: SVG -Section: Painting -Requires: DOM TRANSFORMATIONS SPRINTF -Name: Scalable Vector Graphics (SVG) -SeeAlso: ??? - -Feature: BEZIER -Section: Painting -Requires: -Name: Bezier curves -SeeAlso: ??? - -Feature: PRINTER -Section: Painting -Requires: TEXTSTREAM SPRINTF FONTDATABASE DATESTRING REGEXP_CAPTURE -Name: Printing -SeeAlso: ??? - -Feature: PICTURE -Section: Painting -Requires: DATASTREAM IMAGEIO -Name: QPicture -SeeAlso: ??? - -Feature: LAYOUT -Section: Kernel -Requires: -Name: Automatic widget tqlayout -SeeAlso: ??? - -Feature: STYLE -Section: Widgets -Requires: DRAWUTIL -Name: QStyle -SeeAlso: ??? - -Feature: WIDGET_TOPEXTRA -Section: Kernel -Requires: IMAGE_HEURISTIC_MASK -Name: Window icon and caption -SeeAlso: ??? - -Feature: DIALOG -Section: Widgets -Requires: -Name: Dialogs -SeeAlso: ??? - -Feature: SEMIMODAL -Section: Widgets -Requires: DIALOG -Name: Semi-modal dialogs -SeeAlso: ??? - -Feature: FRAME -Section: Widgets -Requires: STYLE -Name: Framed widgets -SeeAlso: ??? - -Feature: EFFECTS -Section: Kernel -Requires: -Name: Special widget effects (fading, scrolling) -SeeAlso: ??? - -Feature: LABEL -Section: Widgets -Requires: FRAME -Name: QLabel -SeeAlso: ??? - -Feature: TOOLBAR -Section: Widgets -Requires: MAINWINDOW -Name: Toolbars -SeeAlso: ??? - -Feature: BUTTON -Section: Widgets -Requires: -Name: Buttons -SeeAlso: ??? - -Feature: CHECKBOX -Section: Widgets -Requires: BUTTON STYLE -Name: Check-boxes -SeeAlso: ??? - -Feature: RADIOBUTTON -Section: Widgets -Requires: BUTTON STYLE -Name: Radio-buttons -SeeAlso: ??? - -Feature: TOOLBUTTON -Section: Widgets -Requires: BUTTON ICONSET STYLE -Name: Tool-buttons -SeeAlso: ??? - -Feature: GRID -Section: Widgets -Requires: LAYOUT FRAME -Name: Grid tqlayout widgets -SeeAlso: ??? - -Feature: GROUPBOX -Section: Widgets -Requires: FRAME LAYOUT -Name: Group boxes -SeeAlso: ??? - -Feature: BUTTONGROUP -Section: Widgets -Requires: GROUPBOX BUTTON RADIOBUTTON -Name: Button groups -SeeAlso: ??? - -Feature: HGROUPBOX -Section: Widgets -Requires: GROUPBOX -Name: Horizontal group boxes -SeeAlso: ??? - -Feature: VGROUPBOX -Section: Widgets -Requires: HGROUPBOX -Name: Vertical group boxes -SeeAlso: ??? - -Feature: HBUTTONGROUP -Section: Widgets -Requires: BUTTONGROUP -Name: Horizontal button groups -SeeAlso: ??? - -Feature: VBUTTONGROUP -Section: Widgets -Requires: HBUTTONGROUP -Name: Vertical button groups -SeeAlso: ??? - -Feature: HBOX -Section: Widgets -Requires: LAYOUT FRAME -Name: Horizontal box tqlayout widgets -SeeAlso: ??? - -Feature: VBOX -Section: Widgets -Requires: HBOX -Name: Vertical box tqlayout widgets -SeeAlso: ??? - -Feature: MAINWINDOW -Section: Widgets -Requires: STRINGLIST POPUPMENU TITLEBAR RESIZEHANDLER TOOLBUTTON STATUSBAR -Name: Main-windows -SeeAlso: ??? - -Feature: RESIZEHANDLER -Section: Widgets -Requires: FRAME -Name: Internal resize handler -SeeAlso: ??? - -Feature: MENUDATA -Section: Widgets -Requires: ICONSET VARIANT -Name: Menu-oriented widgets -SeeAlso: ??? - -Feature: POPUPMENU -Section: Widgets -Requires: MENUDATA FRAME -Name: Popup-menus -SeeAlso: ??? - -Feature: MENUBAR -Section: Widgets -Requires: POPUPMENU -Name: Menu bars -SeeAlso: ??? - -Feature: PUSHBUTTON -Section: Widgets -Requires: BUTTON STYLE -Name: Push-buttons -SeeAlso: ??? - -Feature: PROGRESSBAR -Section: Widgets -Requires: FRAME -Name: Progress bars -SeeAlso: ??? - -Feature: RANGECONTROL -Section: Widgets -Requires: -Name: Range-control widgets -SeeAlso: ??? - -Feature: SCROLLBAR -Section: Widgets -Requires: RANGECONTROL STYLE -Name: Scroll bars -SeeAlso: ??? - -Feature: SLIDER -Section: Widgets -Requires: RANGECONTROL STYLE -Name: Sliders -SeeAlso: ??? - -Feature: DIAL -Section: Widgets -Requires: RANGECONTROL STYLE -Name: Dials -SeeAlso: ??? - -Feature: SPINWIDGET -Section: Widgets -Requires: FRAME -Name: Spinbox control widget -SeeAlso: ??? - -Feature: SCROLLVIEW -Section: Widgets -Requires: SCROLLBAR FRAME -Name: Scrollable view widgets -SeeAlso: ??? - -Feature: ICONVIEW -Section: Widgets -Requires: SCROLLVIEW IMAGEIO_XPM IMAGE_HEURISTIC_MASK -Name: QIconView -SeeAlso: ??? - -Feature: GRIDVIEW -Section: Widgets -Requires: SCROLLVIEW -Name: QGridView -SeeAlso: ??? - -Feature: TEXTVIEW -Section: Widgets -Requires: TEXTEDIT -Name: QTextView -SeeAlso: ??? - -Feature: TEXTEDIT -Section: Widgets -Requires: RICHTEXT SCROLLVIEW -Name: Rich text edit -SeeAlso: ??? - -Feature: SYNTAXHIGHLIGHTER -Section: Widgets -Requires: TEXTEDIT -Name: Rich text syntax highlighting -SeeAlso: ??? - -Feature: SPLASHSCREEN -Section: Widgets -Requires: IMAGEIO -Name: Splash screen widget -SeeAlso: ??? - - -Feature: TABLEVIEW -Section: Widgets -Requires: SCROLLBAR -Name: Table-like widgets -SeeAlso: ??? - -Feature: LINEEDIT -Section: Widgets -Requires: FRAME -Name: Single-line edits -SeeAlso: ??? - -Feature: MULTILINEEDIT -Section: Widgets -Requires: TEXTEDIT -Name: Multi-line edits -SeeAlso: ??? - -Feature: SPINBOX -Section: Widgets -Requires: RANGECONTROL SPINWIDGET LINEEDIT VALIDATOR -Name: Spin boxes -SeeAlso: ??? - -Feature: SPLITTER -Section: Widgets -Requires: FRAME LAYOUT -Name: Splitters -SeeAlso: ??? - -Feature: STATUSBAR -Section: Widgets -Requires: LAYOUT STYLE -Name: tqStatus bars -SeeAlso: ??? - -Feature: TABBAR -Section: Widgets -Requires: TOOLBUTTON -Name: Tab-bars -SeeAlso: ??? - -Feature: TABWIDGET -Section: Widgets -Requires: TABBAR WIDGETSTACK -Name: Tab widgets -SeeAlso: ??? - -Feature: TOOLTIP -Section: Widgets -Requires: LABEL -Name: Tool tips -SeeAlso: ??? - -Feature: VALIDATOR -Section: Widgets -Requires: -Name: Input validators -SeeAlso: ??? - -Feature: WHATSTHIS -Section: Widgets -Requires: TOOLTIP TOOLBUTTON -Name: "What's this" help -SeeAlso: ??? - -Feature: WIDGETSTACK -Section: Widgets -Requires: FRAME -Name: Widget stacks -SeeAlso: ??? - -Feature: TEXTBROWSER -Section: Widgets -Requires: TEXTVIEW MIME -Name: QTextBrowser -SeeAlso: ??? - -Feature: LISTBOX -Section: Widgets -Requires: SCROLLVIEW STRINGLIST -Name: QListBox -SeeAlso: ??? - -Feature: ACCEL -Section: Kernel -Requires: SPRINTF -Name: Keyboard accelerators and shortcuts -SeeAlso: ??? - -Feature: SIZEGRIP -Section: Widgets -Requires: STYLE -Name: QSizeGrip -SeeAlso: ??? - -Feature: HEADER -Section: Widgets -Requires: STYLE ICONSET -Name: QHeader -SeeAlso: ??? - -Feature: TITLEBAR -Section: Kernel -Requires: STYLE -Name: Internal titlebar widget -SeeAlso: ??? - -Feature: LCDNUMBER -Section: Widgets -Requires: FRAME -Name: QLCDNumber -SeeAlso: ??? - -Feature: ACTION -Section: Kernel -Requires: TOOLBUTTON COMBOBOX -Name: QAction -SeeAlso: ??? - -Feature: COMBOBOX -Section: Widgets -Requires: LISTBOX LINEEDIT POPUPMENU -Name: QComboBox -SeeAlso: ??? - -Feature: LISTVIEW -Section: Widgets -Requires: SCROLLVIEW HEADER LINEEDIT -Name: QListView -SeeAlso: ??? - -Feature: STYLE_WINDOWS -Section: Widgets -Requires: STYLE -Name: Windows style -SeeAlso: ??? - -Feature: STYLE_MOTIF -Section: Widgets -Requires: STYLE -Name: Motif style -SeeAlso: ??? - -Feature: STYLE_INTERLACE -Section: Widgets -Requires: STYLE_MOTIF -Name: Interlace-friendly style -SeeAlso: ??? - -Feature: STYLE_COMPACT -Section: Widgets -Requires: STYLE_WINDOWS -Name: Compact Windows style -SeeAlso: ??? - -Feature: STYLE_PLATINUM -Section: Widgets -Requires: STYLE_WINDOWS -Name: Platinum style -SeeAlso: ??? - -Feature: STYLE_AQUA -Section: Widgets -Requires: STYLE_WINDOWS IMAGE_TRANSFORMATION -Name: Aqua style -SeeAlso: ??? - -Feature: STYLE_CDE -Section: Widgets -Requires: STYLE_MOTIF TRANSFORMATIONS -Name: CDE style -SeeAlso: ??? - -Feature: STYLE_SGI -Section: Widgets -Requires: STYLE_MOTIF TRANSFORMATIONS BUTTON SCROLLBAR SLIDER LINEEDIT MENUBAR -Name: SGI style -SeeAlso: ??? - -Feature: STYLE_MOTIFPLUS -Section: Widgets -Requires: STYLE_MOTIF TRANSFORMATIONS BUTTON SCROLLBAR SLIDER -Name: Motif-plus style -SeeAlso: ??? - -Feature: COLORDIALOG -Section: Widgets -Requires: DIALOG LABEL PUSHBUTTON LINEEDIT VALIDATOR GRIDVIEW LAYOUT -Name: QColorDialog -SeeAlso: ??? - -Feature: MESSAGEBOX -Section: Widgets -Requires: DIALOG PUSHBUTTON LABEL -Name: QMessageBox -SeeAlso: ??? - -Feature: TABDIALOG -Section: Widgets -Requires: DIALOG PUSHBUTTON LAYOUT TABWIDGET -Name: QTabDialog -SeeAlso: ??? - -Feature: WIZARD -Section: Widgets -Requires: DIALOG WIDGETSTACK PUSHBUTTON LAYOUT LABEL -Name: QWizard -SeeAlso: ??? - -Feature: FILEDIALOG -Section: Widgets -Requires: MESSAGEBOX LISTVIEW NETWORKPROTOCOL COMBOBOX SEMIMODAL REGEXP_CAPTURE TOOLBUTTON BUTTONGROUP VBOX SPLITTER PROGRESSBAR WIDGETSTACK DATESTRING -Name: QFileDialog -SeeAlso: ??? - -Feature: FONTDIALOG -Section: Widgets -Requires: DIALOG FONTDATABASE COMBOBOX LABEL CHECKBOX PUSHBUTTON VGROUPBOX VALIDATOR -Name: QFontDialog -SeeAlso: ??? - -Feature: PRINTDIALOG -Section: Widgets -Requires: DIALOG LISTVIEW PRINTER COMBOBOX LABEL BUTTONGROUP SPINBOX RADIOBUTTON PUSHBUTTON DIR -Name: QPrintDialog -SeeAlso: ??? - -Feature: PROGRESSDIALOG -Section: Widgets -Requires: SEMIMODAL LABEL PUSHBUTTON PROGRESSBAR -Name: QProgressDialog -SeeAlso: ??? - -Feature: INPUTDIALOG -Section: Widgets -Requires: DIALOG COMBOBOX LABEL PUSHBUTTON SPINBOX WIDGETSTACK LAYOUT -Name: QInputDialog -SeeAlso: ??? - -Feature: ERRORMESSAGE -Section: Widgets -Requires: DIALOG PUSHBUTTON LABEL CHECKBOX TEXTVIEW -Name: QErrorMessage -SeeAlso: ??? - -Feature: SESSIONMANAGER -Section: Kernel -Requires: STRINGLIST -Name: Session management -SeeAlso: ??? - -Feature: DATETIMEEDIT -Section: Widgets -Requires: RICHTEXT SPINWIDGET DATESTRING -Name: QDateTimeEdit -SeeAlso: ??? - -Feature: TEXTCODECPLUGIN -Section: Internationalization -Requires: COMPONENT TEXTCODEC -Name: QTextCodecPlugin -SeeAlso: ??? - - -Feature: IMAGEFORMATPLUGIN -Section: Images -Requires: COMPONENT IMAGEIO -Name: QImageFormatPlugin -SeeAlso: ??? - - -Feature: WIDGETPLUGIN -Section: Widgets -Requires: COMPONENT ICONSET -Name: QWidgetPlugin -SeeAlso: ??? - - -Feature: DIRECTPAINTER -Section: Painting -Requires: -Name: QDirectPainter -SeeAlso: ??? - - -Feature: DIALOGBUTTONS -Section: Widgets -Requires: LAYOUT STYLE PUSHBUTTON -Name: Experimental internal class -SeeAlso: ??? diff --git a/tqtinterface/qt4/src/tools/qt_tools.pri b/tqtinterface/qt4/src/tools/qt_tools.pri deleted file mode 100644 index 44c0c62..0000000 --- a/tqtinterface/qt4/src/tools/qt_tools.pri +++ /dev/null @@ -1,150 +0,0 @@ -# Qt tools module - -tools { - TOOLS_P = tools - HEADERS += $$TOOLS_H/tqmemarray.h \ - $$TOOLS_H/tqasciicache.h \ - $$TOOLS_H/tqasciidict.h \ - $$TOOLS_H/tqbitarray.h \ - $$TOOLS_H/tqbuffer.h \ - $$TOOLS_H/tqcache.h \ - $$TOOLS_H/tqcleanuphandler.h \ - $$TOOLS_P/tqcomponentfactory_p.h \ - $$TOOLS_P/tqcomlibrary_p.h \ - $$TOOLS_H/tqcstring.h \ - $$TOOLS_H/tqdatastream.h \ - $$TOOLS_H/tqdatetime.h \ - $$TOOLS_H/tqdeepcopy.h \ - $$TOOLS_H/tqdict.h \ - $$TOOLS_H/tqdir.h \ - $$TOOLS_P/tqdir_p.h \ - $$TOOLS_H/tqfile.h \ - $$TOOLS_P/tqfiledefs_p.h \ - $$TOOLS_H/tqfileinfo.h \ - $$TOOLS_H/tqgarray.h \ - $$TOOLS_H/tqgcache.h \ - $$TOOLS_H/tqgdict.h \ - $$TOOLS_H/tqgeneric.h \ - $$TOOLS_H/tqglist.h \ - $$TOOLS_H/tqglobal.h \ - $$TOOLS_P/tqgpluginmanager_p.h \ - $$TOOLS_H/tqgvector.h \ - $$TOOLS_H/tqintcache.h \ - $$TOOLS_H/tqintdict.h \ - $$TOOLS_H/tqiodevice.h \ - $$TOOLS_H/tqlibrary.h \ - $$TOOLS_P/tqlibrary_p.h \ - $$TOOLS_H/tqlocale.h \ - $$TOOLS_P/tqlocale_p.h \ - $$TOOLS_H/tqptrlist.h \ - $$TOOLS_H/tqmap.h \ - $$TOOLS_H/tqmutex.h \ - $$TOOLS_P/tqmutex_p.h \ - $$TOOLS_P/tqmutexpool_p.h \ - $$TOOLS_P/tqpluginmanager_p.h \ - $$TOOLS_H/tqptrcollection.h \ - $$TOOLS_H/tqptrdict.h \ - $$TOOLS_H/tqptrqueue.h \ - $$TOOLS_H/tqregexp.h \ - $$TOOLS_H/tqsemaphore.h \ - $$TOOLS_H/tqsettings.h \ - $$TOOLS_P/tqsettings_p.h \ - $$TOOLS_H/tqshared.h \ - $$TOOLS_H/tqsortedlist.h \ - $$TOOLS_H/tqptrstack.h \ - $$TOOLS_H/tqstring.h \ - $$TOOLS_H/tqstringlist.h \ - $$TOOLS_H/tqstrlist.h \ - $$TOOLS_H/tqstrvec.h \ - $$TOOLS_H/tqtextstream.h \ - $$TOOLS_P/tqthreadinstance_p.h \ - $$TOOLS_H/tqthreadstorage.h\ - $$TOOLS_P/tqunicodetables_p.h \ - $$TOOLS_H/tqptrvector.h \ - $$TOOLS_H/tqvaluelist.h \ - $$TOOLS_H/tqvaluestack.h \ - $$TOOLS_H/tqvaluevector.h \ - $$TOOLS_H/tqwaitcondition.h \ - $$TOOLS_P/tqcom_p.h \ - $$TOOLS_P/tqucom_p.h \ - $$TOOLS_H/tquuid.h - - win32:SOURCES += $$TOOLS_CPP/tqdir_win.cpp \ - $$TOOLS_CPP/tqfile_win.cpp \ - $$TOOLS_CPP/tqfileinfo_win.cpp \ - $$TOOLS_CPP/tqlibrary_win.cpp \ - $$TOOLS_CPP/tqsettings_win.cpp \ - $$TOOLS_CPP/tqmutex_win.cpp \ - $$TOOLS_CPP/tqwaitcondition_win.cpp \ - $$TOOLS_CPP/tqthreadstorage_win.cpp \ - $$TOOLS_CPP/tqcriticalsection_p.cpp - - win32-borland:SOURCES += $$TOOLS_CPP/tqwinexport.cpp - - wince-* { - SOURCES -= $$TOOLS_CPP/tqdir_win.cpp \ - $$TOOLS_CPP/tqfile_win.cpp \ - $$TOOLS_CPP/tqfileinfo_win.cpp - SOURCES += $$TOOLS_CPP/tqdir_wce.cpp \ - $$TOOLS_CPP/tqfile_wce.cpp \ - $$TOOLS_CPP/tqfileinfo_wce.cpp - } - - offmac:SOURCES += $$TOOLS_CPP/tqdir_mac.cpp \ - $$TOOLS_CPP/tqfile_mac.cpp \ - $$TOOLS_CPP/tqfileinfo_mac.cpp - else:unix:SOURCES += $$TOOLS_CPP/tqdir_unix.cpp \ - $$TOOLS_CPP/tqfile_unix.cpp \ - $$TOOLS_CPP/tqfileinfo_unix.cpp \ - $$TOOLS_CPP/tqmutex_unix.cpp \ - $$TOOLS_CPP/tqthreadstorage_unix.cpp \ - $$TOOLS_CPP/tqwaitcondition_unix.cpp - - mac:!x11:!embedded:SOURCES += $$TOOLS_CPP/tqsettings_mac.cpp - mac { - SOURCES+=3rdparty/dlcompat/dlfcn.c - INCLUDEPATH+=3rdparty/dlcompat - } - unix:SOURCES += $$TOOLS_CPP/tqlibrary_unix.cpp - - SOURCES += $$TOOLS_CPP/tqbitarray.cpp \ - $$TOOLS_CPP/tqbuffer.cpp \ - $$TOOLS_CPP/tqcomponentfactory.cpp \ - $$TOOLS_CPP/tqcomlibrary.cpp \ - $$TOOLS_CPP/tqcstring.cpp \ - $$TOOLS_CPP/tqdatastream.cpp \ - $$TOOLS_CPP/tqdatetime.cpp \ - $$TOOLS_CPP/tqdeepcopy.cpp \ - $$TOOLS_CPP/tqdir.cpp \ - $$TOOLS_CPP/tqfile.cpp \ - $$TOOLS_CPP/tqfileinfo.cpp \ - $$TOOLS_CPP/tqgarray.cpp \ - $$TOOLS_CPP/tqgcache.cpp \ - $$TOOLS_CPP/tqgdict.cpp \ - $$TOOLS_CPP/tqglist.cpp \ - $$TOOLS_CPP/tqglobal.cpp \ - $$TOOLS_CPP/tqgpluginmanager.cpp \ - $$TOOLS_CPP/tqgvector.cpp \ - $$TOOLS_CPP/tqiodevice.cpp \ - $$TOOLS_CPP/tqlibrary.cpp \ - $$TOOLS_CPP/tqlocale.cpp \ - $$TOOLS_CPP/tqmap.cpp \ - $$TOOLS_CPP/tqmutexpool.cpp \ - $$TOOLS_CPP/tqptrcollection.cpp \ - $$TOOLS_CPP/tqregexp.cpp \ - $$TOOLS_CPP/tqstring.cpp \ - $$TOOLS_CPP/tqsemaphore.cpp \ - $$TOOLS_CPP/tqsettings.cpp \ - $$TOOLS_CPP/tqstringlist.cpp \ - $$TOOLS_CPP/tqtextstream.cpp \ - $$TOOLS_CPP/tqunicodetables.cpp \ - $$TOOLS_CPP/tqucom.cpp \ - $$TOOLS_CPP/tquuid.cpp - - irix-cc* { - CXXFLAGS_PRELINK = $$TQMAKE_CXXFLAGS - CXXFLAGS_PRELINK -= -O2 - QMAKE_PRE_LINK = $(CXX) -c $$CXXFLAGS_PRELINK -O1 $(INCPATH) -o $(OBJECTS_DIR)/tqlocale.o tools/tqlocale.cpp - } -} - diff --git a/tqtinterface/qt4/src/tools/tqasciicache.h b/tqtinterface/qt4/src/tools/tqasciicache.h deleted file mode 100644 index d783a95..0000000 --- a/tqtinterface/qt4/src/tools/tqasciicache.h +++ /dev/null @@ -1,125 +0,0 @@ -/**************************************************************************** -** -** Definition of TQAsciiCache template/macro class -** -** Created : 950209 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQASCIICACHE_H -#define TQASCIICACHE_H - -#ifndef TQT_H -#include "tqgcache.h" -#endif // TQT_H - - -template<class type> -class TQAsciiCache -#ifdef TQ_TQDOC - : public TQPtrCollection -#else - : public TQGCache -#endif -{ -public: - TQAsciiCache( const TQAsciiCache<type> &c ) : TQGCache(c) {} - TQAsciiCache( int maxCost=100, int size=17, bool caseSensitive=TRUE, - bool copyKeys=TRUE ) - : TQGCache( maxCost, size, AsciiKey, caseSensitive, copyKeys ) {} - ~TQAsciiCache() { clear(); } - TQAsciiCache<type> &operator=( const TQAsciiCache<type> &c ) - { return (TQAsciiCache<type>&)TQGCache::operator=(c); } - int maxCost() const { return TQGCache::maxCost(); } - int totalCost() const { return TQGCache::totalCost(); } - void setMaxCost( int m ) { TQGCache::setMaxCost(m); } - uint count() const { return TQGCache::count(); } - uint size() const { return TQGCache::size(); } - bool isEmpty() const { return TQGCache::count() == 0; } - void clear() { TQGCache::clear(); } - bool insert( const char *k, const type *d, int c=1, int p=0 ) - { return TQGCache::insert_other(k,(Item)d,c,p);} - bool remove( const char *k ) - { return TQGCache::remove_other(k); } - type *take( const char *k ) - { return (type *)TQGCache::take_other(k); } - type *find( const char *k, bool ref=TRUE ) const - { return (type *)TQGCache::find_other(k,ref);} - type *operator[]( const char *k ) const - { return (type *)TQGCache::find_other(k);} - void statistics() const { TQGCache::statistics(); } -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQAsciiCache<void>::deleteItem( TQPtrCollection::Item ) -{ -} -#endif - -template<class type> inline void TQAsciiCache<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type *)d; -} - - -template<class type> -class TQAsciiCacheIterator : public TQGCacheIterator -{ -public: - TQAsciiCacheIterator( const TQAsciiCache<type> &c ):TQGCacheIterator((TQGCache &)c) {} - TQAsciiCacheIterator( const TQAsciiCacheIterator<type> &ci) - : TQGCacheIterator( (TQGCacheIterator &)ci ) {} - TQAsciiCacheIterator<type> &operator=(const TQAsciiCacheIterator<type>&ci) - { return ( TQAsciiCacheIterator<type>&)TQGCacheIterator::operator=( ci ); } - uint count() const { return TQGCacheIterator::count(); } - bool isEmpty() const { return TQGCacheIterator::count() == 0; } - bool atFirst() const { return TQGCacheIterator::atFirst(); } - bool atLast() const { return TQGCacheIterator::atLast(); } - type *toFirst() { return (type *)TQGCacheIterator::toFirst(); } - type *toLast() { return (type *)TQGCacheIterator::toLast(); } - operator type *() const { return (type *)TQGCacheIterator::get(); } - type *current() const { return (type *)TQGCacheIterator::get(); } - const char *currentKey() const { return TQGCacheIterator::getKeyAscii(); } - type *operator()() { return (type *)TQGCacheIterator::operator()();} - type *operator++() { return (type *)TQGCacheIterator::operator++(); } - type *operator+=(uint j) { return (type *)TQGCacheIterator::operator+=(j);} - type *operator--() { return (type *)TQGCacheIterator::operator--(); } - type *operator-=(uint j) { return (type *)TQGCacheIterator::operator-=(j);} -}; - - -#endif // TQASCIICACHE_H diff --git a/tqtinterface/qt4/src/tools/tqasciidict.h b/tqtinterface/qt4/src/tools/tqasciidict.h deleted file mode 100644 index 266d894..0000000 --- a/tqtinterface/qt4/src/tools/tqasciidict.h +++ /dev/null @@ -1,123 +0,0 @@ -/**************************************************************************** -** -** Definition of TQAsciiDict template class -** -** Created : 920821 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQASCIIDICT_H -#define TQASCIIDICT_H - -#ifndef TQT_H -#include "tqgdict.h" -#endif // TQT_H - -template<class type> -class TQAsciiDict -#ifdef TQ_TQDOC - : public TQPtrCollection -#else - : public TQGDict -#endif -{ -public: - TQAsciiDict(int size=17, bool caseSensitive=TRUE, bool copyKeys=TRUE ) - : TQGDict(size,AsciiKey,caseSensitive,copyKeys) {} - TQAsciiDict( const TQAsciiDict<type> &d ) : TQGDict(d) {} - ~TQAsciiDict() { clear(); } - TQAsciiDict<type> &operator=(const TQAsciiDict<type> &d) - { return (TQAsciiDict<type>&)TQGDict::operator=(d); } - uint count() const { return TQGDict::count(); } - uint size() const { return TQGDict::size(); } - bool isEmpty() const { return TQGDict::count() == 0; } - - void insert( const char *k, const type *d ) - { TQGDict::look_ascii(k,(Item)d,1); } - void replace( const char *k, const type *d ) - { TQGDict::look_ascii(k,(Item)d,2); } - bool remove( const char *k ) { return TQGDict::remove_ascii(k); } - type *take( const char *k ) { return (type *)TQGDict::take_ascii(k); } - type *find( const char *k ) const - { return (type *)((TQGDict*)this)->TQGDict::look_ascii(k,0,0); } - type *operator[]( const char *k ) const - { return (type *)((TQGDict*)this)->TQGDict::look_ascii(k,0,0); } - - void clear() { TQGDict::clear(); } - void resize( uint n ) { TQGDict::resize(n); } - void statistics() const { TQGDict::statistics(); } - -#ifdef TQ_TQDOC -protected: - virtual TQDataStream& read( TQDataStream &, TQPtrCollection::Item & ); - virtual TQDataStream& write( TQDataStream &, TQPtrCollection::Item ) const; -#endif - -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQAsciiDict<void>::deleteItem( TQPtrCollection::Item ) -{ -} -#endif - -template<class type> inline void TQAsciiDict<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type *)d; -} - -template<class type> -class TQAsciiDictIterator : public TQGDictIterator -{ -public: - TQAsciiDictIterator(const TQAsciiDict<type> &d) - : TQGDictIterator((TQGDict &)d) {} - ~TQAsciiDictIterator() {} - uint count() const { return dict->count(); } - bool isEmpty() const { return dict->count() == 0; } - type *toFirst() { return (type *)TQGDictIterator::toFirst(); } - operator type *() const { return (type *)TQGDictIterator::get(); } - type *current() const { return (type *)TQGDictIterator::get(); } - const char *currentKey() const { return TQGDictIterator::getKeyAscii(); } - type *operator()() { return (type *)TQGDictIterator::operator()(); } - type *operator++() { return (type *)TQGDictIterator::operator++(); } - type *operator+=(uint j) { return (type *)TQGDictIterator::operator+=(j);} -}; - -#define TQ_DEFINED_TQASCIIDICT -#include "tqwinexport.h" -#endif // TQASCIIDICT_H diff --git a/tqtinterface/qt4/src/tools/tqbitarray.cpp b/tqtinterface/qt4/src/tools/tqbitarray.cpp deleted file mode 100644 index 93bc527..0000000 --- a/tqtinterface/qt4/src/tools/tqbitarray.cpp +++ /dev/null @@ -1,670 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQBitArray class -** -** Created : 940118 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqbitarray.h" -#include "tqdatastream.h" - -#define SHBLOCK ((bitarr_data*)(sharedBlock())) - -#ifdef USE_QT4 - -#else // USE_QT4 - -/*! - \class TQBitVal tqbitarray.h - \reentrant - \brief The TQBitVal class is an internal class, used with TQBitArray. - - \ingroup collection - - The TQBitVal is required by the indexing [] operator on bit arrays. - It is not for use in any other context. -*/ - -/*! - \fn TQBitVal::TQBitVal (TQBitArray* a, uint i) - - Constructs a reference to element \a i in the TQBitArray \a a. - This is what TQBitArray::operator[] constructs its return value - with. -*/ - -/*! - \fn TQBitVal::operator int() - - Returns the value referenced by the TQBitVal. -*/ - -/*! - \fn TQBitVal& TQBitVal::operator= (const TQBitVal& v) - - Sets the value referenced by the TQBitVal to that referenced by - TQBitVal \a v. -*/ - -/*! - \overload TQBitVal& TQBitVal::operator= (bool v) - - Sets the value referenced by the TQBitVal to \a v. -*/ - - -/*! - \class TQBitArray tqbitarray.h - \reentrant - \brief The TQBitArray class provides an array of bits. - - \ingroup collection - \ingroup tools - \ingroup shared - - Because TQBitArray is a TQMemArray, it uses explicit \link - shclass.html sharing\endlink with a reference count. - - A TQBitArray is a special byte array that can access individual - bits and perform bit-operations (AND, OR, XOR and NOT) on entire - arrays or bits. - - Bits can be manipulated by the setBit() and clearBit() functions, - but it is also possible to use the indexing [] operator to test - and set individual bits. The [] operator is a little slower than - setBit() and clearBit() because some tricks are required to - implement single-bit assignments. - - Example: - \code - TQBitArray a(3); - a.setBit( 0 ); - a.clearBit( 1 ); - a.setBit( 2 ); // a = [1 0 1] - - TQBitArray b(3); - b[0] = 1; - b[1] = 1; - b[2] = 0; // b = [1 1 0] - - TQBitArray c; - c = ~a & b; // c = [0 1 0] - \endcode - - When a TQBitArray is constructed the bits are uninitialized. Use - fill() to set all the bits to 0 or 1. The array can be resized - with resize() and copied with copy(). Bits can be set with - setBit() and cleared with clearBit(). Bits can be toggled with - toggleBit(). A bit's value can be obtained with testBit() and with - at(). - - TQBitArray supports the \& (AND), | (OR), ^ (XOR) and ~ (NOT) - operators. -*/ - -/*! \class TQBitArray::bitarr_data - \brief The TQBitArray::bitarr_data class is internal. - \internal -*/ - - -/*! - Constructs an empty bit array. -*/ - -TQBitArray::TQBitArray() : TQByteArray( 0, 0 ) -{ - bitarr_data *x = new bitarr_data; - TQ_CHECK_PTR( x ); - x->nbits = 0; - setSharedBlock( x ); -} - -/*! - Constructs a bit array of \a size bits. The bits are uninitialized. - - \sa fill() -*/ - -TQBitArray::TQBitArray( uint size ) : TQByteArray( 0, 0 ) -{ - bitarr_data *x = new bitarr_data; - TQ_CHECK_PTR( x ); - x->nbits = 0; - setSharedBlock( x ); - resize( size ); -} - -/*! - \fn TQBitArray::TQBitArray( const TQBitArray &a ) - - Constructs a shallow copy of \a a. -*/ - -/*! - \fn TQBitArray &TQBitArray::operator=( const TQBitArray &a ) - - Assigns a shallow copy of \a a to this bit array and returns a - reference to this array. -*/ - - -/*! - Pad last byte with 0-bits. -*/ -void TQBitArray::pad0() -{ - uint sz = size(); - if ( sz && sz%8 ) - *(data()+sz/8) &= (1 << (sz%8)) - 1; -} - - -/*! - \fn uint TQBitArray::size() const - - Returns the bit array's size (number of bits). - - \sa resize() -*/ - -/*! - Resizes the bit array to \a size bits and returns TRUE if the bit - array could be resized; otherwise returns FALSE. The array becomes - a null array if \a size == 0. - - If the array is expanded, the new bits are set to 0. - - \sa size() -*/ - -bool TQBitArray::resize( uint size ) -{ - uint s = this->size(); - if ( !TQByteArray::resize( (size+7)/8 ) ) - return FALSE; // cannot resize - SHBLOCK->nbits = size; - if ( size != 0 ) { // not null array - int ds = (int)(size+7)/8 - (int)(s+7)/8;// number of bytes difference - if ( ds > 0 ) // expanding array - memset( data() + (s+7)/8, 0, ds ); // reset new data - } - return TRUE; -} - - -/*! - Fills the bit array with \a v (1's if \a v is TRUE, or 0's if \a v - is FALSE). - - fill() resizes the bit array to \a size bits if \a size is - nonnegative. - - Returns FALSE if a nonnegative \e size was specified and the bit - array could not be resized; otherwise returns TRUE. - - \sa resize() -*/ - -bool TQBitArray::fill( bool v, int size ) -{ - if ( size >= 0 ) { // resize first - if ( !resize( size ) ) - return FALSE; // cannot resize - } else { - size = this->size(); - } - if ( size > 0 ) - memset( data(), v ? 0xff : 0, (size + 7) / 8 ); - if ( v ) - pad0(); - return TRUE; -} - - -/*! - Detaches from shared bit array data and makes sure that this bit - array is the only one referring to the data. - - If multiple bit arrays share common data, this bit array - dereferences the data and gets a copy of the data. Nothing happens - if there is only a single reference. - - \sa copy() -*/ - -void TQBitArray::detach() -{ - int nbits = SHBLOCK->nbits; - this->duplicate( *this ); - SHBLOCK->nbits = nbits; -} - -/*! - Returns a deep copy of the bit array. - - \sa detach() -*/ - -TQBitArray TQBitArray::copy() const -{ - TQBitArray tmp; - tmp.duplicate( *this ); - ((bitarr_data*)(tmp.sharedBlock()))->nbits = SHBLOCK->nbits; - return tmp; -} - - -/*! - Returns TRUE if the bit at position \a index is set, i.e. is 1; - otherwise returns FALSE. - - \sa setBit(), clearBit() -*/ - -bool TQBitArray::testBit( uint index ) const -{ -#if defined(TQT_CHECK_RANGE) - if ( index >= size() ) { - qWarning( "TQBitArray::testBit: Index %d out of range", index ); - return FALSE; - } -#endif - return (*(data()+(index>>3)) & (1 << (index & 7))) != 0; -} - -/*! - \overload - - Sets the bit at position \a index to 1. - - \sa clearBit() toggleBit() -*/ - -void TQBitArray::setBit( uint index ) -{ -#if defined(TQT_CHECK_RANGE) - if ( index >= size() ) { - qWarning( "TQBitArray::setBit: Index %d out of range", index ); - return; - } -#endif - *(data()+(index>>3)) |= (1 << (index & 7)); -} - -/*! - \fn void TQBitArray::setBit( uint index, bool value ) - - Sets the bit at position \a index to \a value. - - Equivalent to: - \code - if ( value ) - setBit( index ); - else - clearBit( index ); - \endcode - - \sa clearBit() toggleBit() -*/ - -/*! - Clears the bit at position \a index, i.e. sets it to 0. - - \sa setBit(), toggleBit() -*/ - -void TQBitArray::clearBit( uint index ) -{ -#if defined(TQT_CHECK_RANGE) - if ( index >= size() ) { - qWarning( "TQBitArray::clearBit: Index %d out of range", index ); - return; - } -#endif - *(data()+(index>>3)) &= ~(1 << (index & 7)); -} - -/*! - Toggles the bit at position \a index. - - If the previous value was 0, the new value will be 1. If the - previous value was 1, the new value will be 0. - - \sa setBit(), clearBit() -*/ - -bool TQBitArray::toggleBit( uint index ) -{ -#if defined(TQT_CHECK_RANGE) - if ( index >= size() ) { - qWarning( "TQBitArray::toggleBit: Index %d out of range", index ); - return FALSE; - } -#endif - register uchar *p = (uchar *)data() + (index>>3); - uchar b = (1 << (index & 7)); // bit position - uchar c = *p & b; // read bit - *p ^= b; // toggle bit - return c; -} - - -/*! - \fn bool TQBitArray::at( uint index ) const - - Returns the value (0 or 1) of the bit at position \a index. - - \sa operator[]() -*/ - -/*! - \fn TQBitVal TQBitArray::operator[]( int index ) - - Implements the [] operator for bit arrays. - - The returned TQBitVal is a context object. It makes it possible to - get and set a single bit value by its \a index position. - - Example: - \code - TQBitArray a( 3 ); - a[0] = 0; - a[1] = 1; - a[2] = a[0] ^ a[1]; - \endcode - - The functions testBit(), setBit() and clearBit() are faster. - - \sa at() -*/ - -/*! - \overload bool TQBitArray::operator[]( int index ) const - - Implements the [] operator for constant bit arrays. -*/ - - -/*! - Performs the AND operation between all bits in this bit array and - \a a. Returns a reference to this bit array. - - The result has the length of the longest of the two bit arrays, - with any missing bits (i.e. if one array is shorter than the - other), taken to be 0. - \code - TQBitArray a( 3 ), b( 2 ); - a[0] = 1; a[1] = 0; a[2] = 1; // a = [1 0 1] - b[0] = 1; b[1] = 0; // b = [1 0] - a &= b; // a = [1 0 0] - \endcode - - \sa operator|=(), operator^=(), operator~() -*/ - -TQBitArray &TQBitArray::operator&=( const TQBitArray &a ) -{ - resize( TQMAX(size(), a.size()) ); - register uchar *a1 = (uchar *)data(); - register uchar *a2 = (uchar *)a.data(); - int n = TQMIN( TQByteArray::size(), a.TQByteArray::size() ); - int p = TQMAX( TQByteArray::size(), a.TQByteArray::size() ) - n; - while ( n-- > 0 ) - *a1++ &= *a2++; - while ( p-- > 0 ) - *a1++ = 0; - return *this; -} - -/*! - Performs the OR operation between all bits in this bit array and - \a a. Returns a reference to this bit array. - - The result has the length of the longest of the two bit arrays, - with any missing bits (i.e. if one array is shorter than the - other), taken to be 0. - \code - TQBitArray a( 3 ), b( 2 ); - a[0] = 1; a[1] = 0; a[2] = 1; // a = [1 0 1] - b[0] = 1; b[1] = 0; // b = [1 0] - a |= b; // a = [1 0 1] - \endcode - - \sa operator&=(), operator^=(), operator~() -*/ - -TQBitArray &TQBitArray::operator|=( const TQBitArray &a ) -{ - resize( TQMAX(size(), a.size()) ); - register uchar *a1 = (uchar *)data(); - register uchar *a2 = (uchar *)a.data(); - int n = TQMIN( TQByteArray::size(), a.TQByteArray::size() ); - while ( n-- > 0 ) - *a1++ |= *a2++; - return *this; -} - -/*! - Performs the XOR operation between all bits in this bit array and - \a a. Returns a reference to this bit array. - - The result has the length of the longest of the two bit arrays, - with any missing bits (i.e. if one array is shorter than the - other), taken to be 0. - \code - TQBitArray a( 3 ), b( 2 ); - a[0] = 1; a[1] = 0; a[2] = 1; // a = [1 0 1] - b[0] = 1; b[1] = 0; // b = [1 0] - a ^= b; // a = [0 0 1] - \endcode - - \sa operator&=(), operator|=(), operator~() -*/ - -TQBitArray &TQBitArray::operator^=( const TQBitArray &a ) -{ - resize( TQMAX(size(), a.size()) ); - register uchar *a1 = (uchar *)data(); - register uchar *a2 = (uchar *)a.data(); - int n = TQMIN( TQByteArray::size(), a.TQByteArray::size() ); - while ( n-- > 0 ) - *a1++ ^= *a2++; - return *this; -} - -/*! - Returns a bit array that contains the inverted bits of this bit array. - - Example: - \code - TQBitArray a( 3 ), b; - a[0] = 1; a[1] = 0; a[2] = 1; // a = [1 0 1] - b = ~a; // b = [0 1 0] - \endcode -*/ - -TQBitArray TQBitArray::operator~() const -{ - TQBitArray a( size() ); - register uchar *a1 = (uchar *)data(); - register uchar *a2 = (uchar *)a.data(); - int n = TQByteArray::size(); - while ( n-- ) - *a2++ = ~*a1++; - a.pad0(); - return a; -} - - -/*! - \relates TQBitArray - - Returns the AND result between the bit arrays \a a1 and \a a2. - - The result has the length of the longest of the two bit arrays, - with any missing bits (i.e. if one array is shorter than the - other), taken to be 0. - - \sa TQBitArray::operator&=() -*/ - -TQBitArray operator&( const TQBitArray &a1, const TQBitArray &a2 ) -{ - TQBitArray tmp = a1.copy(); - tmp &= a2; - return tmp; -} - -/*! - \relates TQBitArray - - Returns the OR result between the bit arrays \a a1 and \a a2. - - The result has the length of the longest of the two bit arrays, - with any missing bits (i.e. if one array is shorter than the - other), taken to be 0. - - \sa TQBitArray::operator|=() -*/ - -TQBitArray operator|( const TQBitArray &a1, const TQBitArray &a2 ) -{ - TQBitArray tmp = a1.copy(); - tmp |= a2; - return tmp; -} - -/*! - \relates TQBitArray - - Returns the XOR result between the bit arrays \a a1 and \a a2. - - The result has the length of the longest of the two bit arrays, - with any missing bits (i.e. if one array is shorter than the - other), taken to be 0. - - \sa TQBitArray::operator^() -*/ - -TQBitArray operator^( const TQBitArray &a1, const TQBitArray &a2 ) -{ - TQBitArray tmp = a1.copy(); - tmp ^= a2; - return tmp; -} - - -/* \enum TQGArray::array_data - - \warning This will be renamed in the next major release of TQt. Until - then it is undocumented and we recommend against its use. - - \internal - - ### 3.0 rename ### - ### 3.0 move it to TQGArray? ### -*/ - - -/*! - \fn TQBitArray::array_data * TQBitArray::newData() - - \internal - - Returns data specific to TQBitArray that extends what TQGArray provides. - TQPtrCollection mechanism for allowing extra/different data. -*/ - - -/*! - \fn void TQBitArray::deleteData ( array_data * d ) - - \internal - - Deletes data specific to TQBitArray that extended what TQGArray provided. - - TQPtrCollection mechanism for allowing extra/different data. -*/ - - -/***************************************************************************** - TQBitArray stream functions - *****************************************************************************/ - -/*! - \relates TQBitArray - - Writes bit array \a a to stream \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ -#ifndef TQT_NO_DATASTREAM -TQDataStream &operator<<( TQDataStream &s, const TQBitArray &a ) -{ - TQ_UINT32 len = a.size(); - s << len; // write size of array - if ( len > 0 ) // write data - s.writeRawBytes( a.data(), a.TQByteArray::size() ); - return s; -} - -/*! - \relates TQBitArray - - Reads a bit array into \a a from stream \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator>>( TQDataStream &s, TQBitArray &a ) -{ - TQ_UINT32 len; - s >> len; // read size of array - if ( !a.resize( (uint)len ) ) { // resize array -#if defined(TQT_CHECK_NULL) - qWarning( "TQDataStream: Not enough memory to read TQBitArray" ); -#endif - len = 0; - } - if ( len > 0 ) // read data - s.readRawBytes( a.data(), a.TQByteArray::size() ); - return s; -} - -#endif // USE_QT4 - -#endif // TQT_NO_DATASTREAM diff --git a/tqtinterface/qt4/src/tools/tqbitarray.h b/tqtinterface/qt4/src/tools/tqbitarray.h deleted file mode 100644 index 4529162..0000000 --- a/tqtinterface/qt4/src/tools/tqbitarray.h +++ /dev/null @@ -1,204 +0,0 @@ -/**************************************************************************** -** -** Definition of TQBitArray class -** -** Created : 940118 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQBITARRAY_H -#define TQBITARRAY_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqstring.h" -#endif // TQT_H - -#ifdef USE_QT4 - -#include <Qt/qbitarray.h> - -#endif // USE_QT4 - -#ifdef USE_QT4 - -// class TQBitArray; - -// class TQ_EXPORT TQBitVal : public QBitRef -// { -// public: -// TQBitVal( QBitArray *a, uint i ) : QBitRef ( *a, i ) {} -// }; - -typedef QBitRef TQBitVal; - -class TQ_EXPORT TQBitArray : public QBitArray -{ -public: - TQBitArray() : QBitArray() {} - TQBitArray( uint size ) : QBitArray( size ) {} - TQBitArray( const QBitArray &a ) : QBitArray( a ) {} - - inline TQBitArray copy() const { return TQBitArray(*this); } - inline bool tqat( uint index ) const { return at(index); } -}; - -#else // USE_QT4 - -/***************************************************************************** - TQBitVal class; a context class for TQBitArray::operator[] - *****************************************************************************/ - -class TQBitArray; - -class TQ_EXPORT TQBitVal -{ -private: - TQBitArray *array; - uint index; -public: - TQBitVal( TQBitArray *a, uint i ) : array(a), index(i) {} - operator int(); - TQBitVal &operator=( const TQBitVal &v ); - TQBitVal &operator=( bool v ); -}; - - -/***************************************************************************** - TQBitArray class - *****************************************************************************/ - -class TQ_EXPORT TQBitArray : public TQByteArray -{ -public: - TQBitArray(); - TQBitArray( uint size ); - TQBitArray( const TQBitArray &a ) : TQByteArray( a ) {} - - TQBitArray &operator=( const TQBitArray & ); - - uint size() const; - bool resize( uint size ); - - bool fill( bool v, int size = -1 ); - - void detach(); - TQBitArray copy() const; - - bool testBit( uint index ) const; - void setBit( uint index ); - void setBit( uint index, bool value ); - void clearBit( uint index ); - bool toggleBit( uint index ); - - bool at( uint index ) const; - bool tqat( uint index ) const { return at(index); } - TQBitVal operator[]( int index ); - bool operator[]( int index ) const; - - TQBitArray &operator&=( const TQBitArray & ); - TQBitArray &operator|=( const TQBitArray & ); - TQBitArray &operator^=( const TQBitArray & ); - TQBitArray operator~() const; - -protected: - struct bitarr_data : public TQGArray::array_data { - uint nbits; - }; - array_data *newData() { return new bitarr_data; } - void deleteData( array_data *d ) { delete (bitarr_data*)d; } -private: - void pad0(); -}; - - -inline TQBitArray &TQBitArray::operator=( const TQBitArray &a ) -{ return (TQBitArray&)assign( a ); } - -inline uint TQBitArray::size() const -{ return ((bitarr_data*)sharedBlock())->nbits; } - -inline void TQBitArray::setBit( uint index, bool value ) -{ if ( value ) setBit(index); else clearBit(index); } - -inline bool TQBitArray::at( uint index ) const -{ return testBit(index); } - -inline TQBitVal TQBitArray::operator[]( int index ) -{ return TQBitVal( (TQBitArray*)this, index ); } - -inline bool TQBitArray::operator[]( int index ) const -{ return testBit( index ); } - - -/***************************************************************************** - Misc. TQBitArray operator functions - *****************************************************************************/ - -TQ_EXPORT TQBitArray operator&( const TQBitArray &, const TQBitArray & ); -TQ_EXPORT TQBitArray operator|( const TQBitArray &, const TQBitArray & ); -TQ_EXPORT TQBitArray operator^( const TQBitArray &, const TQBitArray & ); - - -inline TQBitVal::operator int() -{ - return array->testBit( index ); -} - -inline TQBitVal &TQBitVal::operator=( const TQBitVal &v ) -{ - array->setBit( index, v.array->testBit(v.index) ); - return *this; -} - -inline TQBitVal &TQBitVal::operator=( bool v ) -{ - array->setBit( index, v ); - return *this; -} - - -/***************************************************************************** - TQBitArray stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQBitArray & ); -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQBitArray & ); -#endif - -#endif // USE_QT4 - -#endif // TQBITARRAY_H diff --git a/tqtinterface/qt4/src/tools/tqbuffer.cpp b/tqtinterface/qt4/src/tools/tqbuffer.cpp deleted file mode 100644 index 81ad242..0000000 --- a/tqtinterface/qt4/src/tools/tqbuffer.cpp +++ /dev/null @@ -1,503 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQBuffer class -** -** Created : 930812 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqbuffer.h" -#include <stdlib.h> - -#ifdef USE_QT4 - -#else // USE_QT4 - -/*! - \class TQBuffer tqbuffer.h - \reentrant - \brief The TQBuffer class is an I/O tqdevice that operates on a TQByteArray. - - \ingroup io - \ingroup collection - - TQBuffer is used to read and write to a memory buffer. It is - normally used with a TQTextStream or a TQDataStream. TQBuffer has an - associated TQByteArray which holds the buffer data. The size() of - the buffer is automatically adjusted as data is written. - - The constructor \c TQBuffer(TQByteArray) creates a TQBuffer using an - existing byte array. The byte array can also be set with - setBuffer(). Writing to the TQBuffer will modify the original byte - array because TQByteArray is \link shclass.html explicitly - shared.\endlink - - Use open() to open the buffer before use and to set the mode - (read-only, write-only, etc.). close() closes the buffer. The - buffer must be closed before reopening or calling setBuffer(). - - A common way to use TQBuffer is through \l TQDataStream or \l - TQTextStream, which have constructors that take a TQBuffer - parameter. For convenience, there are also TQDataStream and - TQTextStream constructors that take a TQByteArray parameter. These - constructors create and open an internal TQBuffer. - - Note that TQTextStream can also operate on a TQString (a Unicode - string); a TQBuffer cannot. - - You can also use TQBuffer directly through the standard TQIODevice - functions readBlock(), writeBlock() readLine(), at(), getch(), - putch() and ungetch(). - - \sa TQFile, TQDataStream, TQTextStream, TQByteArray, \link shclass.html Shared Classes\endlink -*/ - - -/*! - Constructs an empty buffer. -*/ - -TQBuffer::TQBuffer() -{ - setFlags( IO_Direct ); - a_inc = 16; // initial increment - a_len = 0; - ioIndex = 0; -} - - -/*! - Constructs a buffer that operates on \a buf. - - If you open the buffer in write mode (\c IO_WriteOnly or - \c IO_ReadWrite) and write something into the buffer, \a buf - will be modified. - - Example: - \code - TQCString str = "abc"; - TQBuffer b( str ); - b.open( IO_WriteOnly ); - b.at( 3 ); // position at the 4th character (the terminating \0) - b.writeBlock( "def", 4 ); // write "def" including the terminating \0 - b.close(); - // Now, str == "abcdef" with a terminating \0 - \endcode - - \sa setBuffer() -*/ - -TQBuffer::TQBuffer( TQByteArray buf ) : a(buf) -{ - setFlags( IO_Direct ); - a_len = a.size(); - a_inc = (a_len > 512) ? 512 : a_len; // initial increment - if ( a_inc < 16 ) - a_inc = 16; - ioIndex = 0; -} - -/*! - Destroys the buffer. -*/ - -TQBuffer::~TQBuffer() -{ -} - - -/*! - Replaces the buffer's contents with \a buf and returns TRUE. - - Does nothing (and returns FALSE) if isOpen() is TRUE. - - Note that if you open the buffer in write mode (\c IO_WriteOnly or - IO_ReadWrite) and write something into the buffer, \a buf is also - modified because TQByteArray is an explicitly shared class. - - \sa buffer(), open(), close() -*/ - -bool TQBuffer::setBuffer( TQByteArray buf ) -{ - if ( isOpen() ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQBuffer::setBuffer: Buffer is open" ); -#endif - return FALSE; - } - a = buf; - a_len = a.size(); - a_inc = (a_len > 512) ? 512 : a_len; // initial increment - if ( a_inc < 16 ) - a_inc = 16; - ioIndex = 0; - return TRUE; -} - -/*! - \fn TQByteArray TQBuffer::buffer() const - - Returns this buffer's byte array. - - \sa setBuffer() -*/ - -/*! - \reimp - - Opens the buffer in mode \a m. Returns TRUE if successful; - otherwise returns FALSE. The buffer must be opened before use. - - The mode parameter \a m must be a combination of the following flags. - \list - \i \c IO_ReadOnly opens the buffer in read-only mode. - \i \c IO_WriteOnly opens the buffer in write-only mode. - \i \c IO_ReadWrite opens the buffer in read/write mode. - \i \c IO_Append sets the buffer index to the end of the buffer. - \i \c IO_Truncate truncates the buffer. - \endlist - - \sa close(), isOpen() -*/ - -bool TQBuffer::open( int m ) -{ - if ( isOpen() ) { // buffer already open -#if defined(TQT_CHECK_STATE) - qWarning( "TQBuffer::open: Buffer already open" ); -#endif - return FALSE; - } - setMode( m ); - if ( m & IO_Truncate ) { // truncate buffer - a.resize( 0 ); - a_len = 0; - } - if ( m & IO_Append ) { // append to end of buffer - ioIndex = a.size(); - } else { - ioIndex = 0; - } - a_inc = 16; - setState( IO_Open ); - resetqStatus(); - return TRUE; -} - -/*! - \reimp - - Closes an open buffer. - - \sa open() -*/ - -void TQBuffer::close() -{ - if ( isOpen() ) { - setFlags( IO_Direct ); - ioIndex = 0; - a_inc = 16; - } -} - -/*! - \reimp - - The flush function does nothing for a TQBuffer. -*/ - -void TQBuffer::flush() -{ - return; -} - - -/*! - \fn TQIODevice::Offset TQBuffer::at() const - - \reimp -*/ - -/*! - \fn TQIODevice::Offset TQBuffer::size() const - - \reimp -*/ - -/*! - \reimp -*/ - -bool TQBuffer::at( Offset pos ) -{ -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { - qWarning( "TQBuffer::at: Buffer is not open" ); - return FALSE; - } -#endif - if ( pos > a_len ) { -#if defined(TQT_CHECK_RANGE) -#if defined(TQT_ABI_QT4) - qWarning( "TQBuffer::at: Index %lld out of range", pos ); -#else - qWarning( "TQBuffer::at: Index %lu out of range", pos ); -#endif -#endif - return FALSE; - } - ioIndex = pos; - return TRUE; -} - - -/*! - \reimp -*/ - -TQ_LONG TQBuffer::readBlock( char *p, TQ_ULONG len ) -{ -#if defined(TQT_CHECK_STATE) - if ( !p ) { - qWarning( "TQBuffer::readBlock: Null pointer error" ); - return -1; - } - if ( !isOpen() ) { // buffer not open - qWarning( "TQBuffer::readBlock: Buffer not open" ); - return -1; - } - if ( !isReadable() ) { // reading not permitted - qWarning( "TQBuffer::readBlock: Read operation not permitted" ); - return -1; - } -#endif - if ( ioIndex + len > a.size() ) { // overflow - if ( ioIndex >= a.size() ) { - return 0; - } else { - len = a.size() - ioIndex; - } - } - memcpy(p, a.data() + ioIndex, len); - ioIndex += len; - return len; -} - -/*! - \overload TQ_LONG TQBuffer::writeBlock( const TQByteArray& data ) - - This convenience function is the same as calling - \c{writeBlock( data.data(), data.size() )} with \a data. -*/ - -/*! - Writes \a len bytes from \a p into the buffer at the current - index position, overwriting any characters there and extending the - buffer if necessary. Returns the number of bytes actually written. - - Returns -1 if an error occurred. - - \sa readBlock() -*/ - -TQ_LONG TQBuffer::writeBlock( const char *p, TQ_ULONG len ) -{ - if ( len == 0 ) - return 0; - -#if defined(TQT_CHECK_NULL) - if ( p == 0 ) { - qWarning( "TQBuffer::writeBlock: Null pointer error" ); - return -1; - } -#endif -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { // buffer not open - qWarning( "TQBuffer::writeBlock: Buffer not open" ); - return -1; - } - if ( !isWritable() ) { // writing not permitted - qWarning( "TQBuffer::writeBlock: Write operation not permitted" ); - return -1; - } -#endif - if ( ioIndex + len > a_len ) { // overflow - TQ_ULONG new_len = a_len + a_inc*((ioIndex+len-a_len)/a_inc+1); - if ( !a.resize( new_len ) ) { // could not resize -#if defined(TQT_CHECK_NULL) - qWarning( "TQBuffer::writeBlock: Memory allocation error" ); -#endif - setqStatus( IO_ResourceError ); - return -1; - } - a_inc *= 2; // double increment - a_len = new_len; - a.shd->len = ioIndex + len; - } - memcpy( a.data()+ioIndex, p, len ); - ioIndex += len; - if ( a.shd->len < ioIndex ) - a.shd->len = ioIndex; // fake (not alloc'd) length - return len; -} - - -/*! - \reimp -*/ - -TQ_LONG TQBuffer::readLine( char *p, TQ_ULONG maxlen ) -{ -#if defined(TQT_CHECK_NULL) - if ( p == 0 ) { - qWarning( "TQBuffer::readLine: Null pointer error" ); - return -1; - } -#endif -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { // buffer not open - qWarning( "TQBuffer::readLine: Buffer not open" ); - return -1; - } - if ( !isReadable() ) { // reading not permitted - qWarning( "TQBuffer::readLine: Read operation not permitted" ); - return -1; - } -#endif - if ( maxlen == 0 ) - return 0; - TQ_ULONG start = ioIndex; - char *d = a.data() + ioIndex; - maxlen--; // make room for 0-terminator - if ( a.size() - ioIndex < maxlen ) - maxlen = a.size() - ioIndex; - while ( maxlen-- ) { - if ( (*p++ = *d++) == '\n' ) - break; - } - *p = '\0'; - ioIndex = d - a.data(); - return ioIndex - start; -} - - -/*! - \reimp -*/ - -int TQBuffer::getch() -{ -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { // buffer not open - qWarning( "TQBuffer::getch: Buffer not open" ); - return -1; - } - if ( !isReadable() ) { // reading not permitted - qWarning( "TQBuffer::getch: Read operation not permitted" ); - return -1; - } -#endif - if ( ioIndex+1 > a.size() ) { // overflow - setqStatus( IO_ReadError ); - return -1; - } - return uchar(*(a.data()+ioIndex++)); -} - -/*! - \reimp - - Writes the character \a ch into the buffer at the current index - position, overwriting any existing character and extending the - buffer if necessary. - - Returns \a ch, or -1 if an error occurred. - - \sa getch(), ungetch() -*/ - -int TQBuffer::putch( int ch ) -{ -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { // buffer not open - qWarning( "TQBuffer::putch: Buffer not open" ); - return -1; - } - if ( !isWritable() ) { // writing not permitted - qWarning( "TQBuffer::putch: Write operation not permitted" ); - return -1; - } -#endif - if ( ioIndex + 1 > a_len ) { // overflow - char buf[1]; - buf[0] = (char)ch; - if ( writeBlock(buf,1) != 1 ) - return -1; // write error - } else { - *(a.data() + ioIndex++) = (char)ch; - if ( a.shd->len < ioIndex ) - a.shd->len = ioIndex; - } - return ch; -} - -/*! - \reimp -*/ - -int TQBuffer::ungetch( int ch ) -{ -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { // buffer not open - qWarning( "TQBuffer::ungetch: Buffer not open" ); - return -1; - } - if ( !isReadable() ) { // reading not permitted - qWarning( "TQBuffer::ungetch: Read operation not permitted" ); - return -1; - } -#endif - if ( ch != -1 ) { - if ( ioIndex ) - ioIndex--; - else - ch = -1; - } - return ch; -} - -#endif // USE_QT4
\ No newline at end of file diff --git a/tqtinterface/qt4/src/tools/tqbuffer.h b/tqtinterface/qt4/src/tools/tqbuffer.h deleted file mode 100644 index 1cc3fd0..0000000 --- a/tqtinterface/qt4/src/tools/tqbuffer.h +++ /dev/null @@ -1,220 +0,0 @@ -/**************************************************************************** -** -** Definition of TQBuffer class -** -** Created : 930812 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQBUFFER_H -#define TQBUFFER_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqiodevice.h" -#include "tqstring.h" -#endif // TQT_H - -#ifdef USE_QT4 - -#include <Qt/qbuffer.h> - -#endif // USE_QT4 - -#ifdef USE_QT4 - -class TQ_EXPORT TQBuffer : public QBuffer -{ -public: -#if defined(TQT_ABI_QT4) - typedef TQ_LLONG Offset; -#else - typedef TQ_ULONG Offset; -#endif - - #warning Please remember that TQByteArray is no longer explicitly shared. If you get weird crashes while using TQt stream objects please see tqbuffer.h line 69 - // NOTE: - // QByteArray was explicitly shared in Qt3 - // This is no longer the case in Qt4 - // If you get weird crashes inside TQBuffer, it probably means you did something like this: - // - // main() { - // aFunction(); - // otherFunction(); - // } - // - // aFunction() { - // TQBuffer m_Buffer(QByteArray()); - // } - // - // otherFunction() { - // m_Buffer.putch('H'); - // } - // - // The QByteArray object was created within aFunction, but as it went out of scope it was destroyed before otherFunction was called - // Therefore, the TQBuffer's internal reference to the TQByteArray was invalid at the time putch() was called - // You could do this instead: - // - // aFunction() { - // TQBuffer m_Buffer(); - // m_Buffer.tqsetBufferFromCopy(QByteArray()); - // } - - TQBuffer() : QBuffer() {} - TQBuffer( TQByteArray &ba ) : QBuffer( &ba, 0 ) {} - TQBuffer( const TQByteArray &ba ) : QBuffer( const_cast<TQByteArray*>(&ba), 0 ) {} -// TQBuffer( TQByteArray ba ) : QBuffer(), internal_ba_copy(ba) { QBuffer::setBuffer(&internal_ba_copy); } // Make a copy of ba - - inline int state() const { return isOpen() ? 0x1000 : 0; } - inline int mode() const { return (int) openMode(); } - inline int flags() const { return (int) openMode(); } - inline bool tqopen( int mode ) { return open((OpenModeFlag)mode); } - - inline Offset at() const { return pos(); } - inline bool at(Offset offset) { return seek(offset); } - inline Offset tqat() const { return pos(); } - inline bool tqat(Offset offset) { return seek(offset); } - -// virtual inline qint64 readBlock(char *data, quint64 maxlen) { return read(data, maxlen); } -// virtual inline qint64 writeBlock(const char *data, quint64 len) { return write(data, len); } -// virtual inline qint64 writeBlock(const QByteArray &data) { return write(data); } - inline qint64 readBlock(char *data, quint64 maxlen) { return read(data, maxlen); } - inline qint64 writeBlock(const char *data, quint64 len) { return write(data, len); } - inline qint64 writeBlock(const QByteArray &data) { return write(data); } - -// virtual inline qint64 readData ( char * data, qint64 maxSize ) { return readBlock(data, maxSize); } -// virtual inline qint64 writeData ( const char * data, qint64 maxSize ) { return writeBlock(data, maxSize); } - - inline int getch() { char c; return getChar(&c) ? int(uchar(c)) : -1; } - inline int putch(int c) { return putChar(char(c)) ? int(uchar(c)) : -1; } - inline int ungetch(int c) { ungetChar(uchar(c)); return c; } - - inline bool isDirectAccess() const { return !isSequential(); } - inline bool isSequentialAccess() const { return isSequential(); } - inline bool isCombinedAccess() const { return false; } - inline bool isBuffered() const { return true; } - inline bool isRaw() const { return false; } - inline bool isSynchronous() const { return true; } - inline bool isAsynchronous() const { return false; } - inline bool isTranslated() const { return (openMode() & Text) != 0; } - inline bool isInactive() const { return !isOpen(); } - - inline TQByteArray &buffer() { return static_cast<TQByteArray&>(QBuffer::buffer()); } - inline bool setBuffer( TQByteArray &tqba ) { if (isOpen() == TRUE) return FALSE; QBuffer::setBuffer(&tqba); return TRUE; } - inline bool tqsetBufferFromCopy( TQByteArray tqba ) { if (isOpen() == TRUE) return FALSE; internal_ba_copy = tqba; QBuffer::setBuffer(&internal_ba_copy); return TRUE; } -// inline bool setBuffer( TQByteArray tqba ) { if (isOpen() == TRUE) return FALSE; internal_ba_copy = tqba; QBuffer::setBuffer(&internal_ba_copy); return TRUE; } - -public: - typedef int Status; - Status status() const { -#if !defined(QT_NO_QOBJECT) - const QFile *f = qobject_cast<const QFile *>(this); - if (f) return (int) f->error(); -#endif - return isOpen() ? 0 /* IO_Ok */ : 8 /* IO_UnspecifiedError */; - } - void resetStatus() { -#if !defined(QT_NO_QOBJECT) - QFile *f = qobject_cast<QFile *>(this); - if (f) f->unsetError(); -#endif - } - -protected: - void setqStatus( int ) { std::cout << "[WARNING] TQBuffer::setqStatus() UNIMPLEMENTED\n\r"; } - void resetqStatus() { resetStatus(); } - -private: - TQByteArray internal_ba_copy; -}; - -#else // USE_QT4 - -class TQ_EXPORT TQBuffer : public TQIODevice -{ -public: - TQBuffer(); - TQBuffer( TQByteArray ); - ~TQBuffer(); - - TQByteArray buffer() const; - bool setBuffer( TQByteArray ); - - bool open( int ); - void close(); - void flush(); - - Offset size() const; - Offset at() const; - bool at( Offset ); - - TQ_LONG readBlock( char *p, TQ_ULONG ); - TQ_LONG writeBlock( const char *p, TQ_ULONG ); - TQ_LONG writeBlock( const TQByteArray& data ) - { return TQIODevice::writeBlock(data); } - TQ_LONG readLine( char *p, TQ_ULONG ); - - int getch(); - int putch( int ); - int ungetch( int ); - -protected: - TQByteArray a; - -private: - uint a_len; - uint a_inc; - -private: // Disabled copy constructor and operator= -#if defined(TQ_DISABLE_COPY) - TQBuffer( const TQBuffer & ); - TQBuffer &operator=( const TQBuffer & ); -#endif -}; - - -inline TQByteArray TQBuffer::buffer() const -{ return a; } - -inline TQIODevice::Offset TQBuffer::size() const -{ return (Offset)a.size(); } - -inline TQIODevice::Offset TQBuffer::at() const -{ return ioIndex; } - -#endif // USE_QT4 - -#endif // TQBUFFER_H diff --git a/tqtinterface/qt4/src/tools/tqcache.h b/tqtinterface/qt4/src/tools/tqcache.h deleted file mode 100644 index dd50b57..0000000 --- a/tqtinterface/qt4/src/tools/tqcache.h +++ /dev/null @@ -1,121 +0,0 @@ -/**************************************************************************** -** -** Definition of TQCache template class -** -** Created : 950209 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQCACHE_H -#define TQCACHE_H - -#ifndef TQT_H -#include "tqgcache.h" -#endif // TQT_H - -template<class type> -class TQCache -#ifdef TQ_TQDOC - : public TQPtrCollection -#else - : public TQGCache -#endif -{ -public: - TQCache( const TQCache<type> &c ) : TQGCache(c) {} - TQCache( int maxCost=100, int size=17, bool caseSensitive=TRUE ) - : TQGCache( maxCost, size, StringKey, caseSensitive, FALSE ) {} - ~TQCache() { clear(); } - TQCache<type> &operator=( const TQCache<type> &c ) - { return (TQCache<type>&)TQGCache::operator=(c); } - int maxCost() const { return TQGCache::maxCost(); } - int totalCost() const { return TQGCache::totalCost(); } - void setMaxCost( int m ) { TQGCache::setMaxCost(m); } - uint count() const { return TQGCache::count(); } - uint size() const { return TQGCache::size(); } - bool isEmpty() const { return TQGCache::count() == 0; } - void clear() { TQGCache::clear(); } - bool insert( const TQString &k, const type *d, int c=1, int p=0 ) - { return TQGCache::insert_string(k,(Item)d,c,p);} - bool remove( const TQString &k ) - { return TQGCache::remove_string(k); } - type *take( const TQString &k ) - { return (type *)TQGCache::take_string(k); } - type *find( const TQString &k, bool ref=TRUE ) const - { return (type *)TQGCache::find_string(k,ref);} - type *operator[]( const TQString &k ) const - { return (type *)TQGCache::find_string(k);} - void statistics() const { TQGCache::statistics(); } -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQCache<void>::deleteItem( TQPtrCollection::Item ) -{ -} -#endif - -template<class type> inline void TQCache<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type *)d; -} - -template<class type> -class TQCacheIterator : public TQGCacheIterator -{ -public: - TQCacheIterator( const TQCache<type> &c ):TQGCacheIterator((TQGCache &)c) {} - TQCacheIterator( const TQCacheIterator<type> &ci) - : TQGCacheIterator( (TQGCacheIterator &)ci ) {} - TQCacheIterator<type> &operator=(const TQCacheIterator<type>&ci) - { return ( TQCacheIterator<type>&)TQGCacheIterator::operator=( ci ); } - uint count() const { return TQGCacheIterator::count(); } - bool isEmpty() const { return TQGCacheIterator::count() == 0; } - bool atFirst() const { return TQGCacheIterator::atFirst(); } - bool atLast() const { return TQGCacheIterator::atLast(); } - type *toFirst() { return (type *)TQGCacheIterator::toFirst(); } - type *toLast() { return (type *)TQGCacheIterator::toLast(); } - operator type *() const { return (type *)TQGCacheIterator::get(); } - type *current() const { return (type *)TQGCacheIterator::get(); } - TQString currentKey() const{ return TQGCacheIterator::getKeyString(); } - type *operator()() { return (type *)TQGCacheIterator::operator()();} - type *operator++() { return (type *)TQGCacheIterator::operator++(); } - type *operator+=(uint j) { return (type *)TQGCacheIterator::operator+=(j);} - type *operator--() { return (type *)TQGCacheIterator::operator--(); } - type *operator-=(uint j) { return (type *)TQGCacheIterator::operator-=(j);} -}; - -#endif // TQCACHE_H diff --git a/tqtinterface/qt4/src/tools/tqcleanuphandler.h b/tqtinterface/qt4/src/tools/tqcleanuphandler.h deleted file mode 100644 index 47e3484..0000000 --- a/tqtinterface/qt4/src/tools/tqcleanuphandler.h +++ /dev/null @@ -1,130 +0,0 @@ -/**************************************************************************** -** -** ... -** -** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQCLEANUPHANDLER_H -#define TQCLEANUPHANDLER_H - -#ifndef TQT_H -#include "tqptrlist.h" -#endif // TQT_H - -template<class Type> -class TQCleanupHandler -{ -public: - TQCleanupHandler() : cleanupObjects( 0 ) {} - ~TQCleanupHandler() { clear(); } - - Type* add( Type **object ) { - if ( !cleanupObjects ) - cleanupObjects = new TQPtrList<Type*>; - cleanupObjects->insert( 0, object ); - return *object; - } - - void remove( Type **object ) { - if ( !cleanupObjects ) - return; - if ( cleanupObjects->findRef( object ) >= 0 ) - (void) cleanupObjects->take(); - } - - bool isEmpty() const { - return cleanupObjects ? cleanupObjects->isEmpty() : TRUE; - } - - void clear() { - if ( !cleanupObjects ) - return; - TQPtrListIterator<Type*> it( *cleanupObjects ); - Type **object; - while ( ( object = it.current() ) ) { - delete *object; - *object = 0; - cleanupObjects->remove( object ); - } - delete cleanupObjects; - cleanupObjects = 0; - } - -private: - TQPtrList<Type*> *cleanupObjects; -}; - -template<class Type> -class TQSingleCleanupHandler -{ -public: - TQSingleCleanupHandler() : object( 0 ) {} - ~TQSingleCleanupHandler() { - if ( object ) { - delete *object; - *object = 0; - } - } - Type* set( Type **o ) { - object = o; - return *object; - } - void reset() { object = 0; } -private: - Type **object; -}; - -template<class Type> -class TQSharedCleanupHandler -{ -public: - TQSharedCleanupHandler() : object( 0 ) {} - ~TQSharedCleanupHandler() { - if ( object ) { - if ( (*object)->deref() ) - delete *object; - *object = 0; - } - } - Type* set( Type **o ) { - object = o; - return *object; - } - void reset() { object = 0; } -private: - Type **object; -}; - -#endif //TQCLEANUPHANDLER_H diff --git a/tqtinterface/qt4/src/tools/tqcom_p.h b/tqtinterface/qt4/src/tools/tqcom_p.h deleted file mode 100644 index 2d41781..0000000 --- a/tqtinterface/qt4/src/tools/tqcom_p.h +++ /dev/null @@ -1,344 +0,0 @@ -/**************************************************************************** -** -** ... -** -** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQCOM_P_H -#define TQCOM_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of a number of TQt sources files. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// -// - -#ifndef TQT_H -#include "tqstringlist.h" -#include "tquuid.h" -#endif // TQT_H - -#if __GNUC__ - 0 > 3 -#pragma GCC system_header -#endif - -#ifndef TQT_NO_COMPONENT - -class TQObject; -struct TQUInterfaceDescription; -struct TQUObject; - -#define TQRESULT unsigned long -#define TQS_OK (TQRESULT)0x00000000 -#define TQS_FALSE (TQRESULT)0x00000001 - -#define TQE_NOTIMPL (TQRESULT)0x80000001 -#define TQE_OUTOFMEMORY (TQRESULT)0x80000002 -#define TQE_INVALIDARG (TQRESULT)0x80000003 -#define TQE_NOINTERFACE (TQRESULT)0x80000004 -#define TQE_NOCOMPONENT (TQRESULT)0x80000005 - - -// {1D8518CD-E8F5-4366-99E8-879FD7E482DE} -#ifndef IID_TQUnknown -#define IID_TQUnknown TQUuid(0x1d8518cd, 0xe8f5, 0x4366, 0x99, 0xe8, 0x87, 0x9f, 0xd7, 0xe4, 0x82, 0xde) -#endif - -struct TQ_EXPORT TQUnknownInterface -{ - virtual TQRESULT queryInterface( const TQUuid&, TQUnknownInterface** ) = 0; - virtual ulong addRef() = 0; - virtual ulong release() = 0; -}; - -// {FBAC965E-A441-413F-935E-CDF582573FAB} -#ifndef IID_TQDispatch -#define IID_TQDispatch TQUuid( 0xfbac965e, 0xa441, 0x413f, 0x93, 0x5e, 0xcd, 0xf5, 0x82, 0x57, 0x3f, 0xab) -#endif - -// the dispatch interface that inherits the unknown interface.. It is -// used to explore interfaces during runtime and to do dynamic calls. -struct TQ_EXPORT TQDispatchInterface : public TQUnknownInterface -{ - // returns the interface description of this dispatch interface. - virtual const TQUInterfaceDescription* interfaceDescription() const = 0; - - // returns the event description of this dispatch interface. - virtual const TQUInterfaceDescription* eventsDescription() const = 0; - - // invokes method id with parameters V*. Returns some sort of - // exception code. - virtual TQRESULT invoke( int id, TQUObject* o ) = 0; - - // installs listener as event listener - virtual void installListener( TQDispatchInterface* listener ) = 0; - - // remove listener as event listener - virtual void removeListener( TQDispatchInterface* listener ) = 0; -}; - -template <class T> -class TQInterfacePtr -{ -public: - TQInterfacePtr():iface(0){} - - TQInterfacePtr( T* i) { - if ( (iface = i) ) - iface->addRef(); - } - - TQInterfacePtr(const TQInterfacePtr<T> &p) { - if ( (iface = p.iface) ) - iface->addRef(); - } - - ~TQInterfacePtr() { - if ( iface ) - iface->release(); - } - - TQInterfacePtr<T> &operator=(const TQInterfacePtr<T> &p) { - if ( iface != p.iface ) { - if ( iface ) - iface->release(); - if ( (iface = p.iface) ) - iface->addRef(); - } - return *this; - } - - TQInterfacePtr<T> &operator=(T* i) { - if (iface != i ) { - if ( iface ) - iface->release(); - if ( (iface = i) ) - iface->addRef(); - } - return *this; - } - - bool operator==( const TQInterfacePtr<T> &p ) const { return iface == p.iface; } - - bool operator!= ( const TQInterfacePtr<T>& p ) const { return !( *this == p ); } - - bool isNull() const { return !iface; } - - T* operator->() const { return iface; } - - T& operator*() const { return *iface; } - - operator T*() const { return iface; } - - TQUnknownInterface** operator &() const { - if( iface ) - iface->release(); - return (TQUnknownInterface**)&iface; - } - - T** operator &() { - if ( iface ) - iface->release(); - return &iface; - } - -private: - T* iface; -}; - -// {10A1501B-4C5F-4914-95DD-C400486CF900} -#ifndef IID_TQObject -#define IID_TQObject TQUuid( 0x10a1501b, 0x4c5f, 0x4914, 0x95, 0xdd, 0xc4, 0x00, 0x48, 0x6c, 0xf9, 0x00) -#endif - -struct TQ_EXPORT TQObjectInterface -{ - virtual TQObject* qObject() = 0; -}; - -// {5F3968A5-F451-45b1-96FB-061AD98F926E} -#ifndef IID_TQComponentInformation -#define IID_TQComponentInformation TQUuid(0x5f3968a5, 0xf451, 0x45b1, 0x96, 0xfb, 0x6, 0x1a, 0xd9, 0x8f, 0x92, 0x6e) -#endif - -struct TQ_EXPORT TQComponentInformationInterface : public TQUnknownInterface -{ - virtual TQString name() const = 0; - virtual TQString description() const = 0; - virtual TQString author() const = 0; - virtual TQString version() const = 0; -}; - -// {6CAA771B-17BB-4988-9E78-BA5CDDAAC31E} -#ifndef IID_TQComponentFactory -#define IID_TQComponentFactory TQUuid( 0x6caa771b, 0x17bb, 0x4988, 0x9e, 0x78, 0xba, 0x5c, 0xdd, 0xaa, 0xc3, 0x1e) -#endif - -struct TQ_EXPORT TQComponentFactoryInterface : public TQUnknownInterface -{ - virtual TQRESULT createInstance( const TQUuid &cid, const TQUuid &iid, TQUnknownInterface** instance, TQUnknownInterface *outer ) = 0; -}; - -// {D16111D4-E1E7-4C47-8599-24483DAE2E07} -#ifndef IID_TQLibrary -#define IID_TQLibrary TQUuid( 0xd16111d4, 0xe1e7, 0x4c47, 0x85, 0x99, 0x24, 0x48, 0x3d, 0xae, 0x2e, 0x07) -#endif - -struct TQ_EXPORT TQLibraryInterface : public TQUnknownInterface -{ - virtual bool init() = 0; - virtual void cleanup() = 0; - virtual bool canUnload() const = 0; -}; - -// {3F8FDC44-3015-4f3e-B6D6-E4AAAABDEAAD} -#ifndef IID_TQFeatureList -#define IID_TQFeatureList TQUuid(0x3f8fdc44, 0x3015, 0x4f3e, 0xb6, 0xd6, 0xe4, 0xaa, 0xaa, 0xbd, 0xea, 0xad) -#endif - -struct TQ_EXPORT TQFeatureListInterface : public TQUnknownInterface -{ - virtual TQStringList featureList() const = 0; -}; - -// {B5FEB5DE-E0CD-4E37-B0EB-8A812499A0C1} -#ifndef IID_TQComponentRegistration -#define IID_TQComponentRegistration TQUuid( 0xb5feb5de, 0xe0cd, 0x4e37, 0xb0, 0xeb, 0x8a, 0x81, 0x24, 0x99, 0xa0, 0xc1) -#endif - -struct TQ_EXPORT TQComponentRegistrationInterface : public TQUnknownInterface -{ - virtual bool registerComponents( const TQString &filepath ) const = 0; - virtual bool unregisterComponents() const = 0; -}; - -// internal class that wraps an initialized ulong -struct TQ_EXPORT TQtULong -{ - TQtULong() : ref( 0 ) { } - operator unsigned long () const { return ref; } - unsigned long& operator++() { return ++ref; } - unsigned long operator++( int ) { return ref++; } - unsigned long& operator--() { return --ref; } - unsigned long operator--( int ) { return ref--; } - - unsigned long ref; -}; -// default implementation of ref counting. A variable "ulong ref" has to be a member - - -#define TQ_REFCOUNT \ -private: \ - TQtULong qtrefcount; \ -public: \ - ulong addRef() {return qtrefcount++;} \ - ulong release() {if(!--qtrefcount){delete this;return 0;}return qtrefcount;} - -#ifndef TQ_EXPORT_COMPONENT -#if defined(TQT_THREAD_SUPPORT) -#define TQT_THREADED_BUILD 1 -#define TQ_UCM_FLAGS_STRING "11" -#else -#define TQT_THREADED_BUILD 0 -#define TQ_UCM_FLAGS_STRING "01" -#endif - -#ifndef TQ_EXTERN_C -#ifdef __cplusplus -#define TQ_EXTERN_C extern "C" -#else -#define TQ_EXTERN_C extern -#endif -#endif - -// this is duplicated at TQ_PLUGIN_VERIFICATION_DATA in tqgplugin.h -// NOTE: if you change pattern, you MUST change the pattern in -// qcomlibrary.cpp as well. changing the pattern will break all -// backwards compatibility as well (no old plugins will be loaded). -#ifndef TQ_UCM_VERIFICATION_DATA -# define TQ_UCM_VERIFICATION_DATA \ - static const char *qt_ucm_verification_data = \ - "pattern=""TQT_UCM_VERIFICATION_DATA""\n" \ - "version="TQT_VERSION_STR"\n" \ - "flags="TQ_UCM_FLAGS_STRING"\n" \ - "buildkey="TQT_BUILD_KEY"\0"; -#endif // TQ_UCM_VERIFICATION_DATA - -// This macro expands to the default implementation of ucm_instantiate. -#ifndef TQ_CREATE_INSTANCE -# define TQ_CREATE_INSTANCE( IMPLEMENTATION ) \ - IMPLEMENTATION *i = new IMPLEMENTATION; \ - TQUnknownInterface* iface = 0; \ - i->queryInterface( IID_TQUnknown, &iface ); \ - return iface; -#endif // TQ_CREATE_INSTANCE - -# ifdef TQ_WS_WIN -# ifdef TQ_CC_BOR -# define TQ_EXPORT_COMPONENT() \ - TQ_UCM_VERIFICATION_DATA \ - TQ_EXTERN_C __declspec(dllexport) \ - const char * __stdcall qt_ucm_query_verification_data() \ - { return qt_ucm_verification_data; } \ - TQ_EXTERN_C __declspec(dllexport) TQUnknownInterface* \ - __stdcall ucm_instantiate() -# else -# define TQ_EXPORT_COMPONENT() \ - TQ_UCM_VERIFICATION_DATA \ - TQ_EXTERN_C __declspec(dllexport) \ - const char *qt_ucm_query_verification_data() \ - { return qt_ucm_verification_data; } \ - TQ_EXTERN_C __declspec(dllexport) TQUnknownInterface* ucm_instantiate() -# endif -# else -# define TQ_EXPORT_COMPONENT() \ - TQ_UCM_VERIFICATION_DATA \ - TQ_EXTERN_C \ - const char *qt_ucm_query_verification_data() \ - { return qt_ucm_verification_data; } \ - TQ_EXTERN_C TQUnknownInterface* ucm_instantiate() -# endif -# define TQ_EXPORT_INTERFACE() TQ_EXPORT_COMPONENT() -#endif - -#endif //TQT_NO_COMPONENT - -#endif //TQCOM_P_H diff --git a/tqtinterface/qt4/src/tools/tqcomlibrary.cpp b/tqtinterface/qt4/src/tools/tqcomlibrary.cpp deleted file mode 100644 index 4bbeee3..0000000 --- a/tqtinterface/qt4/src/tools/tqcomlibrary.cpp +++ /dev/null @@ -1,538 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQComLibrary class -** -** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqcomlibrary_p.h" - -#ifndef TQT_NO_COMPONENT -#include <tqapplication.h> -#include <tqsettings.h> -#include <tqfileinfo.h> -#include <tqdatetime.h> -#include <tqcleanuphandler.h> -#ifndef NO_ERRNO_H -#include <errno.h> -#endif // NO_ERROR_H - -#ifdef TQT_THREAD_SUPPORT -# include "tqmutexpool_p.h" -#endif // TQT_THREAD_SUPPORT - -#ifndef TQT_DEBUG_COMPONENT -# if defined(TQT_DEBUG) -# define TQT_DEBUG_COMPONENT 1 -# endif -#endif - - -TQComLibrary::TQComLibrary( const TQString &filename ) - : TQLibrary( filename ), entry( 0 ), libiface( 0 ), qt_version( 0 ) -{ -} - -TQComLibrary::~TQComLibrary() -{ - if ( autoUnload() ) - unload(); - if ( libiface ) - libiface->release(); - if ( entry ) - entry->release(); -} - -bool TQComLibrary::unload() -{ - int refs = entry ? entry->release() : 0; - entry = 0; - if (refs || !libiface) - return FALSE; - - libiface->cleanup(); - if ( !libiface->canUnload() ) - return FALSE; - libiface->release(); - libiface = 0; - - return TQLibrary::unload(); -} - -static bool qt_verify( const TQString& library, uint version, uint flags, - const TQCString &key, bool warn ) -{ - uint our_flags = 1; -#if defined(TQT_THREAD_SUPPORT) - our_flags |= 2; -#endif - - if ( (flags & 1) == 0 ) { - if ( warn ) - qWarning( "Conflict in %s:\n" - " Plugin cannot be queried successfully! [2]", - (const char*) TQFile::encodeName(library) ); - } else if ( ( version > TQT_VERSION ) || - ( ( TQT_VERSION & 0xff0000 ) > ( version & 0xff0000 ) ) ) { - if ( warn ) - qWarning( "Conflict in %s:\n" - " Plugin uses incompatible TQt library (%d.%d.%d)!", - (const char*) TQFile::encodeName(library), - (version&0xff0000) >> 16, (version&0xff00) >> 8, version&0xff ); - } else if ( (flags & 2) != (our_flags & 2) ) { - if ( warn ) - qWarning( "Conflict in %s:\n" - " Plugin uses %s TQt library!", - (const char*) TQFile::encodeName(library), - (flags & 2) ? "multi threaded" : "single threaded" ); - } else if ( key != TQT_BUILD_KEY ) { - if ( warn ) - qWarning( "Conflict in %s:\n" - " Plugin uses incompatible TQt library!\n" - " expected build key \"%s\", got \"%s\".", - (const char*) TQFile::encodeName(library), - TQT_BUILD_KEY, - key.isEmpty() ? "<null>" : (const char *) key ); - } else { - return TRUE; - } - return FALSE; -} - -struct qt_token_info -{ - qt_token_info( const char *f, const ulong fc ) - : fields( f ), field_count( fc ), results( fc ), lengths( fc ) - { - results.fill( 0 ); - lengths.fill( 0 ); - } - - const char *fields; - const ulong field_count; - - TQMemArray<const char *> results; - TQMemArray<ulong> lengths; -}; - -/* - return values: - 1 parse ok - 0 eos - -1 parse error -*/ -static int qt_tokenize( const char *s, ulong s_len, ulong *advance, - const qt_token_info &token_info ) -{ - ulong pos = 0, field = 0, fieldlen = 0; - char current; - int ret = -1; - *advance = 0; - for (;;) { - current = s[ pos ]; - - // next char - ++pos; - ++fieldlen; - ++*advance; - - if ( ! current || pos == s_len + 1 ) { - // save result - token_info.results[ (int)field ] = s; - token_info.lengths[ (int)field ] = fieldlen - 1; - - // end of string - ret = 0; - break; - } - - if ( current == token_info.fields[ field ] ) { - // save result - token_info.results[ (int)field ] = s; - token_info.lengths[ (int)field ] = fieldlen - 1; - - // end of field - fieldlen = 0; - ++field; - if ( field == token_info.field_count - 1 ) { - // parse ok - ret = 1; - } - if ( field == token_info.field_count ) { - // done parsing - break; - } - - // reset string and its length - s = s + pos; - s_len -= pos; - pos = 0; - } - } - - return ret; -} - -/* - returns TRUE if the string s was correctly parsed, FALSE otherwise. -*/ -static bool tqt_parse_pattern( const char *s, uint *version, uint *flags, - TQCString *key ) -{ - bool ret = TRUE; - - qt_token_info pinfo("=\n", 2); - int parse; - ulong at = 0, advance, parselen = tqstrlen( s ); - do { - parse = qt_tokenize( s + at, parselen, &advance, pinfo ); - if ( parse == -1 ) { - ret = FALSE; - break; - } - - at += advance; - parselen -= advance; - - if ( tqstrncmp( "version", pinfo.results[ 0 ], pinfo.lengths[ 0 ] ) == 0 ) { - // parse version string - qt_token_info pinfo2("..-", 3); - if ( qt_tokenize( pinfo.results[ 1 ], pinfo.lengths[ 1 ], - &advance, pinfo2 ) != -1 ) { - TQCString m( pinfo2.results[ 0 ], pinfo2.lengths[ 0 ] + 1 ); - TQCString n( pinfo2.results[ 1 ], pinfo2.lengths[ 1 ] + 1 ); - TQCString p( pinfo2.results[ 2 ], pinfo2.lengths[ 2 ] + 1 ); - *version = (m.toUInt() << 16) | (n.toUInt() << 8) | p.toUInt(); - } else { - ret = FALSE; - break; - } - } else if ( tqstrncmp( "flags", pinfo.results[ 0 ], pinfo.lengths[ 0 ] ) == 0 ) { - // parse flags string - char ch; - *flags = 0; - ulong p = 0, c = 0, bit = 0; - while ( p < pinfo.lengths[ 1 ] ) { - ch = pinfo.results[ 1 ][ p ]; - bit = pinfo.lengths[ 1 ] - p - 1; - c = 1 << bit; - if ( ch == '1' ) { - *flags |= c; - } else if ( ch != '0' ) { - ret = FALSE; - break; - } - ++p; - } - } else if ( tqstrncmp( "buildkey", pinfo.results[ 0 ], - pinfo.lengths[ 0 ] ) == 0 ){ - // save buildkey - *key = TQCString( pinfo.results[ 1 ], pinfo.lengths[ 1 ] + 1 ); - } - } while ( parse == 1 && parselen > 0 ); - - return ret; -} - -#if defined(TQ_OS_UNIX) - -#if defined(TQ_OS_FREEBSD) || defined(TQ_OS_LINUX) -# define USE_MMAP -# include <sys/types.h> -# include <sys/mman.h> -#endif // TQ_OS_FREEBSD || TQ_OS_LINUX - -static long qt_find_pattern( const char *s, ulong s_len, - const char *pattern, ulong p_len ) -{ - /* - this uses the same algorithm as TQString::findRev... - - we search from the end of the file because on the supported - systems, the read-only data/text segments are placed at the end - of the file. HOWEVER, when building with debugging enabled, all - the debug symbols are placed AFTER the data/text segments. - - what does this mean? when building in release mode, the search - is fast because the data we are looking for is at the end of the - file... when building in debug mode, the search is slower - because we have to skip over all the debugging symbols first - */ - - if ( ! s || ! pattern || p_len > s_len ) return -1; - ulong i, hs = 0, hp = 0, delta = s_len - p_len; - - for (i = 0; i < p_len; ++i ) { - hs += s[delta + i]; - hp += pattern[i]; - } - i = delta; - for (;;) { - if ( hs == hp && tqstrncmp( s + i, pattern, p_len ) == 0 ) - return i; - if ( i == 0 ) - break; - --i; - hs -= s[i + p_len]; - hs += s[i]; - } - - return -1; -} - -/* - This opens the specified library, mmaps it into memory, and searches - for the TQT_UCM_VERIFICATION_DATA. The advantage of this approach is that - we can get the verification data without have to actually load the library. - This lets us detect mismatches more safely. - - Returns FALSE if version/flags/key information is not present, or if the - information could not be read. - Returns TRUE if version/flags/key information is present and succesfully read. -*/ -static bool tqt_unix_query( const TQString &library, uint *version, uint *flags, - TQCString *key ) -{ - TQFile file( library ); - if (! file.open( IO_ReadOnly ) ) { - qWarning( "%s: %s", (const char*) TQFile::encodeName(library), - strerror( errno ) ); - return FALSE; - } - - TQByteArray data; - char *filedata = 0; - ulong fdlen = 0; - -#ifdef USE_MMAP - char *mapaddr = 0; - size_t maplen = file.size(); - mapaddr = (char *) mmap( mapaddr, maplen, PROT_READ, MAP_PRIVATE, file.handle(), 0 ); - if ( mapaddr != MAP_FAILED ) { - // mmap succeeded - filedata = mapaddr; - fdlen = maplen; - } else { - // mmap failed - qWarning( "mmap: %s", strerror( errno ) ); -#endif // USE_MMAP - // try reading the data into memory instead - data = file.readAll(); - filedata = data.data(); - fdlen = data.size(); -#ifdef USE_MMAP - } -#endif // USE_MMAP - - // verify that the pattern is present in the plugin - const char *pattern = "pattern=TQT_UCM_VERIFICATION_DATA"; - const ulong plen = tqstrlen( pattern ); - long pos = qt_find_pattern( filedata, fdlen, pattern, plen ); - - bool ret = FALSE; - if ( pos >= 0 ) { - ret = tqt_parse_pattern( filedata + pos, version, flags, key ); - } - -#ifdef USE_MMAP - if ( mapaddr != MAP_FAILED && munmap(mapaddr, maplen) != 0 ) { - qWarning( "munmap: %s", strerror( errno ) ); - } -#endif // USE_MMAP - - file.close(); - return ret; -} - -#endif // TQ_OS_UNIX - - -static TQSettings *cache = 0; -static TQSingleCleanupHandler<TQSettings> cleanup_cache; - -void TQComLibrary::createInstanceInternal() -{ - if ( library().isEmpty() ) - return; - - TQFileInfo fileinfo( library() ); - TQString lastModified = fileinfo.lastModified().toString(Qt::ISODate); - TQString regkey = TQString("/TQt Plugins %1.%2/%3") - .arg( ( TQT_VERSION & 0xff0000 ) >> 16 ) - .arg( ( TQT_VERSION & 0xff00 ) >> 8 ) - .arg( library() ); - TQStringList reg; - uint flags = 0; - TQCString key; - bool query_done = FALSE; - bool warn_mismatch = TRUE; - -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker locker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &cache ) : 0 ); -#endif // TQT_THREAD_SUPPORT - - if ( ! cache ) { - cache = new TQSettings; - cache->insertSearchPath( TQSettings::Windows, "/Trolltech" ); - cleanup_cache.set( &cache ); - } - - reg = cache->readListEntry( regkey ); - if ( reg.count() == 4 ) { - // check timestamp - if ( lastModified == reg[3] ) { - qt_version = reg[0].toUInt(0, 16); - flags = reg[1].toUInt(0, 16); - key = reg[2].latin1(); - - query_done = TRUE; - warn_mismatch = FALSE; - } - } - -#if defined(TQ_OS_UNIX) - if ( ! query_done ) { - // get the query information directly from the plugin without loading - if ( tqt_unix_query( library(), &qt_version, &flags, &key ) ) { - // info read succesfully from library - query_done = TRUE; - } - } -#else // !TQ_OS_UNIX - if ( ! query_done ) { - // get the query information by loading the plugin - if ( !isLoaded() ) { - TQ_ASSERT( entry == 0 ); - if ( !load() ) - return; - } - -# ifdef TQ_CC_BOR - typedef const char * __stdcall (*UCMQueryVerificationDataProc)(); -# else - typedef const char * (*UCMQueryVerificationDataProc)(); -# endif - UCMQueryVerificationDataProc ucmQueryVerificationdataProc; - ucmQueryVerificationdataProc = - (UCMQueryVerificationDataProc) resolve( "qt_ucm_query_verification_data" ); - - if ( !ucmQueryVerificationdataProc || - !tqt_parse_pattern( ucmQueryVerificationdataProc(), - &qt_version, &flags, &key ) ) { - qt_version = flags = 0; - key = "unknown"; - } else { - query_done = TRUE; - } - } -#endif // TQ_OS_UNIX - - TQStringList queried; - queried << TQString::number( qt_version,16 ) - << TQString::number( flags, 16 ) - << key - << lastModified; - - if ( queried != reg ) { - cache->writeEntry( regkey, queried ); - // delete the cache, which forces the settings to be written - delete cache; - cache = 0; - } - - if ( ! query_done ) { - if ( warn_mismatch ) { - qWarning( "Conflict in %s:\n Plugin cannot be queried successfully! [1]", - (const char*) TQFile::encodeName( library() ) ); - } - unload(); - return; - } - - if ( ! qt_verify( library(), qt_version, flags, key, warn_mismatch ) ) { - unload(); - return; - } else if ( !isLoaded() ) { - TQ_ASSERT( entry == 0 ); - if ( !load() ) - return; - } - -#ifdef TQ_CC_BOR - typedef TQUnknownInterface* __stdcall (*UCMInstanceProc)(); -#else - typedef TQUnknownInterface* (*UCMInstanceProc)(); -#endif - UCMInstanceProc ucmInstanceProc; - ucmInstanceProc = (UCMInstanceProc) resolve( "ucm_instantiate" ); -#if defined(TQT_DEBUG_COMPONENT) - if ( !ucmInstanceProc ) - qWarning( "%s: Not a UCOM library.", (const char*) TQFile::encodeName(library()) ); -#endif - entry = ucmInstanceProc ? ucmInstanceProc() : 0; - - if ( entry ) { - if ( entry->queryInterface( IID_TQLibrary, (TQUnknownInterface**)&libiface ) == TQS_OK ) { - if ( libiface && !libiface->init() ) { - libiface->release(); - libiface = 0; - unload(); - return; - } - } - } else { -#if defined(TQT_DEBUG_COMPONENT) - qWarning( "%s: No exported component provided.", (const char*) TQFile::encodeName(library()) ); -#endif - unload(); - } -} - -TQRESULT TQComLibrary::queryInterface( const TQUuid& request, TQUnknownInterface** iface ) -{ - if ( !entry ) - createInstanceInternal(); - return entry ? entry->queryInterface( request, iface ) : TQE_NOCOMPONENT; -} - -uint TQComLibrary::qtVersion() -{ - if ( !entry ) - createInstanceInternal(); - return entry ? qt_version : 0; -} - - -#endif // TQT_NO_COMPONENT diff --git a/tqtinterface/qt4/src/tools/tqcomlibrary_p.h b/tqtinterface/qt4/src/tools/tqcomlibrary_p.h deleted file mode 100644 index 470ff4c..0000000 --- a/tqtinterface/qt4/src/tools/tqcomlibrary_p.h +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** -** -** Definition of TQComLibrary class -** -** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQCOMLIBRARY_P_H -#define TQCOMLIBRARY_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of a number of TQt sources files. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// -// - -#ifndef TQT_H -#include "tqcom_p.h" -#include "tqlibrary.h" -#endif // TQT_H - -#ifndef TQT_NO_COMPONENT - -class TQ_EXPORT TQComLibrary : public TQLibrary -{ -public: - TQComLibrary( const TQString &filename ); - ~TQComLibrary(); - - bool unload(); - TQRESULT queryInterface( const TQUuid &iid, TQUnknownInterface **iface ); - uint qtVersion(); - -private: - void createInstanceInternal(); - - TQUnknownInterface *entry; - TQLibraryInterface *libiface; - uint qt_version; - -}; - -#endif //TQT_NO_COMPONENT - -#endif diff --git a/tqtinterface/qt4/src/tools/tqcomponentfactory.cpp b/tqtinterface/qt4/src/tools/tqcomponentfactory.cpp deleted file mode 100644 index 6aea36e..0000000 --- a/tqtinterface/qt4/src/tools/tqcomponentfactory.cpp +++ /dev/null @@ -1,355 +0,0 @@ -/**************************************************************************** -** -** Implementation of the TQComponentFactory class -** -** Created : 990101 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqcomponentfactory_p.h" - -#ifndef TQT_NO_COMPONENT -#include "tqsettings.h" -#include <private/tqcomlibrary_p.h> -#include "tqdir.h" -#include "tqapplication.h" - -/*! - \class TQComponentFactory qcomponentfactory.h - \brief The TQComponentFactory class provides static functions to create and register components. - - \internal - - The static convenience functions can be used both by applications to instantiate components, - and by component servers to register components. - - The createInstance() function provides a pointer to an interface implemented in a specific - component if the component requested has been installed properly and implements the interface. - - Use registerServer() to load a component server and register its components, and unregisterServer() - to unregister the components. The component exported by the component server has to implement the - TQComponentRegistrationInterface. - - The static functions registerComponent() and unregisterComponent() register and unregister a single - component in the system component registry, and should be used when implementing the - \link TQComponentRegistrationInterface::registerComponents() registerCompontents() \endlink and - \link TQComponentRegistrationInterface::unregisterComponents() unregisterCompontents() \endlink functions - in the TQComponentRegistrationInterface. - - A component is registered using a UUID, but can additionally be registered with a name, version and - description. A component registered with a name and a version can be instantiated by client applications - using the name and specific version number, or the highest available version number for that component by - just using the name. A component that is registered calling - - \code - TQComponentFactory::registerComponent( TQUuid(...), filename, "MyProgram.Component", 1 ); - \endcode - - can be instantiated calling either: - - \code - TQComponentFactory::createInstance( TQUuid(...), IID_XYZ, (TQUnknownInterface**)&iface ); - \endcode - or - \code - TQComponentFactory::createInstance( "MyProgram.Component", IID_XYZ, (TQUnknownInterface**)&iface ); - \endcode - or - \code - TQComponentFactory::createInstance( "MyProgram.Component.1", IID_XYZ, (TQUnknownInterface**)&iface ); - \endcode - - The first and the last way will always instantiate exactly the component registered above, while - the second call might also return a later version of the same component. This allows smoother upgrading - of components, and is easier to use in application source code, but should only be used when new versions - of the component are guaranteed to work with the application. - - The component name can be anything, but should be unique on the system the component is being - installed on. A common naming convention for components is \e application.component. - - \sa TQComponentRegistrationInterface TQComponentFactoryInterface -*/ - - -static TQPtrList<TQComLibrary> *libraries = 0; - -static void cleanup() -{ - delete libraries; - libraries = 0; -} - -static TQPtrList<TQComLibrary> *liblist() -{ - if ( !libraries ) { - libraries = new TQPtrList<TQComLibrary>(); - libraries->setAutoDelete( TRUE ); - qAddPostRoutine( cleanup ); - } - return libraries; -} - -/*! - Searches for the component identifier \a cid in the system component registry, - loads the corresponding component server and queries for the interface \a iid. - \a iface is set to the resulting interface pointer. \a cid can either be the - UUID or the name of the component. - - The parameter \a outer is a pointer to the outer interface used - for containment and aggregation and is propagated to the \link - TQComponentFactoryInterface::createInstance() createInstance() \endlink - implementation of the TQComponentFactoryInterface in the component server if - provided. - - The function returns TQS_OK if the interface was successfully instantiated, TQE_NOINTERFACE if - the component does not provide an interface \a iid, or TQE_NOCOMPONENT if there was - an error loading the component. - - Example: - \code - TQInterfacePtr<MyInterface> iface; - if ( TQComponentFactory::createInstance( IID_MyInterface, CID_MyComponent, (TQUnknownInterface**)&iface ) == TQS_OK ) - iface->doSomething(); - ... - } - \endcode -*/ -TQRESULT TQComponentFactory::createInstance( const TQString &cid, const TQUuid &iid, TQUnknownInterface** iface, TQUnknownInterface *outer ) -{ - TQSettings settings; - settings.insertSearchPath( TQSettings::Windows, "/Classes" ); - bool ok = FALSE; - TQString cidStr = cid; - TQRESULT res = TQE_NOCOMPONENT; - - TQUuid uuid( cidStr ); // try to parse, and resolve CLSID if necessary - if ( uuid.isNull() ) { - uuid = settings.readEntry( "/" + cid + "/CLSID/Default", TQString::null, &ok ); - cidStr = uuid.toString().upper(); - } - - if ( cidStr.isEmpty() ) - return res; - - TQString file = settings.readEntry( "/CLSID/" + cidStr + "/InprocServer32/Default", TQString::null, &ok ); - if ( !ok ) - return res; - - TQComLibrary *library = new TQComLibrary( file ); - library->setAutoUnload( FALSE ); - - TQComponentFactoryInterface *cfIface =0; - library->queryInterface( IID_TQComponentFactory, (TQUnknownInterface**)&cfIface ); - - if ( cfIface ) { - res = cfIface->createInstance( uuid, iid, iface, outer ); - cfIface->release(); - } else { - res = library->queryInterface( iid, iface ); - } - TQLibraryInterface *libiface = 0; - if ( library->queryInterface( IID_TQLibrary, (TQUnknownInterface**)&libiface ) != TQS_OK || !tqApp ) { - delete library; // only deletes the object, thanks to TQLibrary::Manual - } else { - libiface->release(); - library->setAutoUnload( TRUE ); - liblist()->prepend( library ); - } - return res; -} - -/*! - Loads the shared library \a filename and queries for a - TQComponentRegistrationInterface. If the library implements this interface, - the \link TQComponentRegistrationInterface::registerComponents() - registerComponents() \endlink function is called. - - Returns TRUE if the interface is found and successfully called, - otherwise returns FALSE. -*/ -TQRESULT TQComponentFactory::registerServer( const TQString &filename ) -{ - TQComLibrary lib( filename ); - lib.load(); - TQComponentRegistrationInterface *iface = 0; - TQRESULT res = lib.queryInterface( IID_TQComponentRegistration, (TQUnknownInterface**)&iface ); - if ( res != TQS_OK ) - return res; - TQDir dir( filename ); - bool ok = iface->registerComponents( dir.absPath() ); - iface->release(); - return ok ? TQS_OK : TQS_FALSE; -} - -/*! - Loads the shared library \a filename and queries for a - TQComponentRegistrationInterface. If the library implements this interface, - the \link TQComponentRegistrationInterface::unregisterComponents() - unregisterComponents() \endlink function is called. - - Returns TRUE if the interface is found and successfully unregistered, - otherwise returns FALSE. -*/ -TQRESULT TQComponentFactory::unregisterServer( const TQString &filename ) -{ - TQComLibrary lib( filename ); - lib.load(); - TQComponentRegistrationInterface *iface = 0; - TQRESULT res = lib.queryInterface( IID_TQComponentRegistration, (TQUnknownInterface**)&iface ); - if ( res != TQS_OK ) - return res; - bool ok = iface->unregisterComponents(); - iface->release(); - return ok ? TQS_OK : TQS_FALSE; -} - -/*! - Registers the component with id \a cid in the system component registry and - returns TRUE if the component was registerd successfully, otherwise returns - FALSE. The component is provided by the component server at \a filepath and - registered with an optional \a name, \a version and \a description. - - This function does nothing and returns FALSE if a component with an identical - \a cid does already exist on the system. - - A component that has been registered with a \a name can be created using both the - \a cid and the \a name value using createInstance(). - - Call this function for each component in an implementation of - \link TQComponentRegistrationInterface::registerComponents() registerComponents() \endlink. - - \sa unregisterComponent(), registerServer(), createInstance() -*/ -bool TQComponentFactory::registerComponent( const TQUuid &cid, const TQString &filepath, const TQString &name, int version, const TQString &description ) -{ - bool ok = FALSE; - TQSettings settings; - settings.insertSearchPath( TQSettings::Windows, "/Classes" ); - - TQString cidStr = cid.toString().upper(); - settings.readEntry( "/CLSID/" + cidStr + "/InprocServer32/Default", TQString::null, &ok ); - if ( ok ) // don't overwrite existing component - return FALSE; - - ok = settings.writeEntry( "/CLSID/" + cidStr + "/InprocServer32/Default", filepath ); - if ( ok && !!description ) - settings.writeEntry( "/CLSID/" + cidStr + "/Default", description ); - - // register the human readable part - if ( ok && !!name ) { - TQString vName = version ? name + "." + TQString::number( version ) : name; - settings.writeEntry( "/CLSID/" + cidStr + "/ProgID/Default", vName ); - ok = settings.writeEntry( "/" + vName + "/CLSID/Default", cidStr ); - if ( ok && !!description ) - settings.writeEntry( "/" + vName + "/Default", description ); - - if ( ok && version ) { - settings.writeEntry( "/CLSID/" + cidStr + "/VersionIndependentProgID/Default", name ); - TQString curVer = settings.readEntry( "/" + name + "/CurVer/Default" ); - if ( !curVer || curVer < vName ) { // no previous, or a lesser version installed - settings.writeEntry( "/" + name + "/CurVer/Default", vName ); - ok = settings.writeEntry( "/" + name + "/CLSID/Default", cidStr ); - if ( ok && !!description ) - settings.writeEntry( "/" + name + "/Default", description ); - } - } - } - - return ok; -} - -/*! - Unregisters the component with id \a cid from the system component registry and returns - TRUE if the component was unregistered successfully, otherwise returns FALSE. - - Call this function for each component in an implementation of - \link TQComponentRegistrationInterface::unregisterComponents() unregisterComponents() \endlink. - - \sa registerComponent(), unregisterServer() -*/ -bool TQComponentFactory::unregisterComponent( const TQUuid &cid ) -{ - TQSettings settings; - bool ok = FALSE; - settings.insertSearchPath( TQSettings::Windows, "/Classes" ); - - TQString cidStr = cid.toString().upper(); - if ( cidStr.isEmpty() ) - return FALSE; - - // unregister the human readable part - TQString vName = settings.readEntry( "/CLSID/" + cidStr + "/ProgID/Default", TQString::null, &ok ); - if ( ok ) { - TQString name = settings.readEntry( "/CLSID/" + cidStr + "/VersionIndependentProgID/Default", TQString::null ); - if ( !!name && settings.readEntry( "/" + name + "/CurVer/Default" ) == vName ) { - // unregistering the current version -> change CurVer to previous version - TQString version = vName.right( vName.length() - name.length() - 1 ); - TQString newVerName; - TQString newCidStr; - if ( version.find( '.' ) == -1 ) { - int ver = version.toInt(); - // see if a lesser version is installed, and make that the CurVer - while ( ver-- ) { - newVerName = name + "." + TQString::number( ver ); - newCidStr = settings.readEntry( "/" + newVerName + "/CLSID/Default" ); - if ( !!newCidStr ) - break; - } - } else { - // oh well... - } - if ( !!newCidStr ) { - settings.writeEntry( "/" + name + "/CurVer/Default", newVerName ); - settings.writeEntry( "/" + name + "/CLSID/Default", newCidStr ); - } else { - settings.removeEntry( "/" + name + "/CurVer/Default" ); - settings.removeEntry( "/" + name + "/CLSID/Default" ); - settings.removeEntry( "/" + name + "/Default" ); - } - } - - settings.removeEntry( "/" + vName + "/CLSID/Default" ); - settings.removeEntry( "/" + vName + "/Default" ); - } - - settings.removeEntry( "/CLSID/" + cidStr + "/VersionIndependentProgID/Default" ); - settings.removeEntry( "/CLSID/" + cidStr + "/ProgID/Default" ); - settings.removeEntry( "/CLSID/" + cidStr + "/InprocServer32/Default" ); - ok = settings.removeEntry( "/CLSID/" + cidStr + "/Default" ); - - return ok; -} - -#endif // TQT_NO_COMPONENT diff --git a/tqtinterface/qt4/src/tools/tqcomponentfactory_p.h b/tqtinterface/qt4/src/tools/tqcomponentfactory_p.h deleted file mode 100644 index acec9d4..0000000 --- a/tqtinterface/qt4/src/tools/tqcomponentfactory_p.h +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************************** -** -** Definition of the TQComponentFactory class -** -** Created : 990101 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQCOMPONENTFACTORY_P_H -#define TQCOMPONENTFACTORY_P_H - -#ifndef TQT_H -#include "tqcom_p.h" -#endif // TQT_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of a number of TQt sources files. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// -// - -#ifndef TQT_NO_COMPONENT - -class TQ_EXPORT TQComponentFactory -{ -public: - static TQRESULT createInstance( const TQString &cid, const TQUuid &iid, TQUnknownInterface** instance, TQUnknownInterface *outer = 0 ); - static TQRESULT registerServer( const TQString &filename ); - static TQRESULT unregisterServer( const TQString &filename ); - - static bool registerComponent( const TQUuid &cid, const TQString &filename, const TQString &name = TQString::null, - int version = 0, const TQString &description = TQString::null ); - static bool unregisterComponent( const TQUuid &cid ); -}; - -#endif // TQT_NO_COMPONENT - -#endif // TQCOMPONENTFACTORY_P_H diff --git a/tqtinterface/qt4/src/tools/tqconfig-dist.h b/tqtinterface/qt4/src/tools/tqconfig-dist.h deleted file mode 100644 index 1e4c589..0000000 --- a/tqtinterface/qt4/src/tools/tqconfig-dist.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef TQT_H -#endif /* TQT_H */ - -/* - Empty leaves all features enabled. See doc/html/features.html for choices. - - Note that disabling some features will produce a libtqt that is not - compatible with other libtqt builds. Such modifications are only - supported on TQt/Embedded where reducing the library size is important - and where the application-suite is often a fixed set. -*/ diff --git a/tqtinterface/qt4/src/tools/tqconfig-large.h b/tqtinterface/qt4/src/tools/tqconfig-large.h deleted file mode 100644 index 2b44bf7..0000000 --- a/tqtinterface/qt4/src/tools/tqconfig-large.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef TQT_H -#endif /* TQT_H */ -#ifndef TQT_NO_CODECS -#define TQT_NO_CODECS -#endif -#define TQT_NO_UNICODETABLES -#define TQT_NO_IMAGEIO_BMP -#define TQT_NO_IMAGEIO_PPM -#define TQT_NO_ASYNC_IO -#define TQT_NO_ASYNC_IMAGE_IO -/* #define TQT_NO_FREETYPE */ -#define TQT_NO_BDF -//#define TQT_NO_FONTDATABASE -#define TQT_NO_TRANSLATION -#define TQT_NO_DRAGANDDROP -#define TQT_NO_CLIPBOARD -#define TQT_NO_SOUND -#define TQT_NO_PROPERTIES -#define TQT_NO_DNS -#define TQT_NO_NETWORKPROTOCOL -#define TQT_NO_URL -#define TQT_NO_COLORNAMES -#define TQT_NO_TRANSFORMATIONS -#define TQT_NO_PRINTER -#define TQT_NO_PICTURE -#define TQT_NO_ICONVIEW -#define TQT_NO_DIAL -#define TQT_NO_WORKSPACE -#define TQT_NO_TABLE -#define TQT_NO_ACTION -#define TQT_NO_STYLE_MOTIF -#define TQT_NO_STYLE_PLATINUM -/* #define TQT_NO_FILEDIALOG */ -#define TQT_NO_FONTDIALOG -#define TQT_NO_PRINTDIALOG -/* #define TQT_NO_COLORDIALOG */ -#define TQT_NO_INPUTDIALOG -/* #define TQT_NO_MESSAGEBOX */ -#define TQT_NO_PROGRESSDIALOG -/* #define TQT_NO_TABDIALOG */ -#define TQT_NO_WIZARD -#define TQT_NO_EFFECTS diff --git a/tqtinterface/qt4/src/tools/tqconfig-medium.h b/tqtinterface/qt4/src/tools/tqconfig-medium.h deleted file mode 100644 index 36254aa..0000000 --- a/tqtinterface/qt4/src/tools/tqconfig-medium.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef TQT_H -#endif /* TQT_H */ -#ifndef TQT_NO_TEXTCODEC /* tqmoc? */ -#define TQT_NO_TEXTCODEC -#endif -#define TQT_NO_UNICODETABLES -#define TQT_NO_IMAGEIO_BMP -#define TQT_NO_IMAGEIO_PPM -/* #define TQT_NO_IMAGEIO_PNG */ -#define TQT_NO_ASYNC_IO -#define TQT_NO_ASYNC_IMAGE_IO -/* #define TQT_NO_FREETYPE */ -#define TQT_NO_BDF -//#define TQT_NO_FONTDATABASE -#define TQT_NO_TRANSLATION -#define TQT_NO_DRAGANDDROP -#define TQT_NO_CLIPBOARD -#define TQT_NO_SOUND -#define TQT_NO_PROPERTIES -#define TQT_NO_DNS -#define TQT_NO_NETWORKPROTOCOL -#define TQT_NO_COLORNAMES -#define TQT_NO_TRANSFORMATIONS -#define TQT_NO_PRINTER -#define TQT_NO_PICTURE -#define TQT_NO_ICONVIEW -#define TQT_NO_DIAL -#define TQT_NO_WORKSPACE -#define TQT_NO_TABLE -#define TQT_NO_ACTION -#define TQT_NO_STYLE_MOTIF -#define TQT_NO_STYLE_PLATINUM -/* #define TQT_NO_FILEDIALOG */ -#define TQT_NO_FONTDIALOG -#define TQT_NO_PRINTDIALOG -/* #define TQT_NO_COLORDIALOG */ -#define TQT_NO_INPUTDIALOG -/* #define TQT_NO_MESSAGEBOX */ -#define TQT_NO_PROGRESSDIALOG -/* #define TQT_NO_TABDIALOG */ -#define TQT_NO_WIZARD -#define TQT_NO_EFFECTS - - -#define TQT_NO_MIME -/* #define TQT_NO_NETWORK //??? means single-process only */ - - -#define TQT_NO_IMAGE_TRUECOLOR -/* #define TQT_NO_IMAGE_SMOOTHSCALE //needed for iconset --> pushbutton */ -#define TQT_NO_IMAGE_TEXT -#define TQT_NO_DIR - -/* #define TQT_NO_TEXTSTREAM */ -#define TQT_NO_DATASTREAM -#define TQT_NO_TQWS_SAVEFONTS - -#define TQT_NO_SESSIONMANAGER - - -/* #define TQT_NO_DIALOG */ - -#define TQT_NO_SEMIMODAL - -#define TQT_NO_EFFECTS -#define TQT_NO_COP - -#define TQT_NO_TQWS_PROPERTIES - -/* #define TQT_NO_RANGECONTROL */ -/* #define TQT_NO_SPLITTER */ -#define TQT_NO_STATUSBAR -#define TQT_NO_TABBAR -#define TQT_NO_TOOLBAR -#define TQT_NO_TOOLTIP -/* #define TQT_NO_VALIDATOR */ -#define TQT_NO_WHATSTHIS -#define TQT_NO_WIDGETSTACK -#define TQT_NO_ACCEL -#define TQT_NO_SIZEGRIP -#define TQT_NO_HEADER -#define TQT_NO_WORKSPACE -#define TQT_NO_LCDNUMBER -#define TQT_NO_STYLE_MOTIF -#define TQT_NO_STYLE_PLATINUM -#define TQT_NO_PROGRESSBAR - -#define TQT_NO_ICONVIEW -#define TQT_NO_DIAL - -#define TQT_NO_TABLE - -/* #define TQT_NO_FILEDIALOG */ -#define TQT_NO_FONTDIALOG -#define TQT_NO_PRINTDIALOG -#define TQT_NO_COLORDIALOG -#define TQT_NO_INPUTDIALOG -/* #define TQT_NO_MESSAGEBOX */ -#define TQT_NO_PROGRESSDIALOG -/* #define TQT_NO_TABDIALOG */ -#define TQT_NO_WIZARD -#define TQT_NO_EFFECTS - -/* #define TQT_NO_TQWS_HYDRO_WM_STYLE */ -#define TQT_NO_TQWS_BEOS_WM_STYLE -#define TQT_NO_TQWS_KDE2_WM_STYLE -#define TQT_NO_TQWS_KDE_WM_STYLE -/* #define TQT_NO_TQWS_WINDOWS_WM_STYLE */ diff --git a/tqtinterface/qt4/src/tools/tqconfig-minimal.h b/tqtinterface/qt4/src/tools/tqconfig-minimal.h deleted file mode 100644 index 8c406bd..0000000 --- a/tqtinterface/qt4/src/tools/tqconfig-minimal.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef TQT_H -#endif /* TQT_H */ - -#ifndef TQT_NO_CHECK -# define TQT_NO_CHECK -#endif -#define TQT_NO_PROCESS -#define TQT_NO_PALETTE -#define TQT_NO_ACTION -#ifndef TQT_NO_TEXTCODEC /* tqmoc? */ -#define TQT_NO_TEXTCODEC -#endif -#define TQT_NO_UNICODETABLES -#define TQT_NO_IMAGEIO_BMP -#define TQT_NO_IMAGEIO_PPM -#define TQT_NO_IMAGEIO_XBM -#define TQT_NO_IMAGEIO_XPM -/* #define TQT_NO_IMAGEIO_PNG //done by configure -no-png */ -#define TQT_NO_ASYNC_IO -#define TQT_NO_ASYNC_IMAGE_IO -/* //#define TQT_NO_FREETYPE //done by configure -no-freetype */ -#define TQT_NO_BDF -//#define TQT_NO_FONTDATABASE -#define TQT_NO_TRANSLATION -#define TQT_NO_MIME -#define TQT_NO_SOUND -/* #define TQT_NO_PROPERTIES */ -#define TQT_NO_TQWS_CURSOR -#define TQT_NO_CURSOR -#define TQT_NO_TQWS_GFX_SPEED -#define TQT_NO_NETWORK -#define TQT_NO_COLORNAMES -#define TQT_NO_TRANSFORMATIONS -#define TQT_NO_PRINTER -#define TQT_NO_PICTURE -#define TQT_NO_LAYOUT -#define TQT_NO_DRAWUTIL -#define TQT_NO_IMAGE_TRUECOLOR -#define TQT_NO_IMAGE_SMOOTHSCALE -#define TQT_NO_IMAGE_TEXT -#define TQT_NO_DIR -#define TQT_NO_TQWS_MANAGER -#define TQT_NO_TEXTSTREAM -#define TQT_NO_DATASTREAM -#define TQT_NO_TQWS_SAVEFONTS -//#define TQT_NO_STRINGLIST -#define TQT_NO_TEMPLATE_VARIANT -#define TQT_NO_SESSIONMANAGER -#define TQT_NO_TQWS_KEYBOARD -#define TQT_NO_SYNTAXHIGHLIGHTER - -#define TQT_NO_ACCEL -#define TQT_NO_BUTTON -#define TQT_NO_DIALOG -#define TQT_NO_FRAME -#define TQT_NO_SEMIMODAL - -#define TQT_NO_STYLE -#define TQT_NO_EFFECTS -#define TQT_NO_COP - -#define TQT_NO_SQL - -#define TQT_NO_REGEXP_CAPTURE -#define TQT_NO_REGEXP_WILDCARD - -#define TQT_NO_VALIDATOR -#define TQT_NO_SPRINTF - -#define TQT_NO_REGEXP - -#define TQT_NO_IMAGEIO - -/* #define TQT_NO_VARIANT //needed for Q_SIGNALS/Q_SLOTS */ - -#define TQT_NO_RANGECONTROL -#define TQT_NO_TQUUID_STRING -#define TQT_NO_SIGNALMAPPER - -#define TQT_NO_WHEELEVENT -#define TQT_NO_BEZIER - -#define TQT_NO_TQWS_MOUSE_AUTO -/* #define TQT_NO_TQWS_MOUSE_MANUAL */ - -#define TQT_NO_IMAGE_DITHER_TO_1 -#define TQT_NO_IMAGE_HEURISTIC_MASK -#define TQT_NO_IMAGE_MIRROR - -#ifndef TQT_NO_STL -# define TQT_NO_STL -#endif - -#define TQT_NO_DATESTRING -#define TQT_NO_WMATRIX - -#define TQT_NO_DIRECTPAINTER diff --git a/tqtinterface/qt4/src/tools/tqconfig-small.h b/tqtinterface/qt4/src/tools/tqconfig-small.h deleted file mode 100644 index f4b772a..0000000 --- a/tqtinterface/qt4/src/tools/tqconfig-small.h +++ /dev/null @@ -1,94 +0,0 @@ -#define NO_CHECK -#ifndef TQT_H -#endif /* TQT_H */ - -#define TQT_NO_ACTION -#ifndef TQT_NO_TEXTCODEC /* tqmoc? */ -#define TQT_NO_TEXTCODEC -#endif -#define TQT_NO_UNICODETABLES -#define TQT_NO_IMAGEIO_BMP -#define TQT_NO_IMAGEIO_PPM -#define TQT_NO_IMAGEIO_XBM -#define TQT_NO_IMAGEIO_XPM -/* #define TQT_NO_IMAGEIO_PNG //done by configure -no-png */ -#define TQT_NO_ASYNC_IO -#define TQT_NO_ASYNC_IMAGE_IO -/* #define TQT_NO_FREETYPE //done by configure -no-freetype */ -#define TQT_NO_BDF -//#define TQT_NO_FONTDATABASE -#define TQT_NO_TRANSLATION -#define TQT_NO_MIME -#define TQT_NO_SOUND -#define TQT_NO_PROPERTIES -#define TQT_NO_SYNTAXHIGHLIGHTER - -#define TQT_NO_TQWS_GFX_SPEED -#define TQT_NO_NETWORK /* ?????????????? */ -#define TQT_NO_COLORNAMES -#define TQT_NO_TRANSFORMATIONS -#define TQT_NO_PRINTER -#define TQT_NO_PICTURE - -#define TQT_NO_IMAGE_TRUECOLOR -/* #define TQT_NO_IMAGE_SMOOTHSCALE //needed for iconset --> pushbutton */ -#define TQT_NO_IMAGE_TEXT -#define TQT_NO_DIR - -#define TQT_NO_TEXTSTREAM -#define TQT_NO_DATASTREAM -#define TQT_NO_TQWS_SAVEFONTS -//#define TQT_NO_STRINGLIST -#define TQT_NO_SESSIONMANAGER - - -#define TQT_NO_DIALOG - -#define TQT_NO_SEMIMODAL - -/* #define TQT_NO_STYLE //will require substantial work... */ - -#define TQT_NO_EFFECTS -#define TQT_NO_COP - -#define TQT_NO_TQWS_PROPERTIES - -#define TQT_NO_RANGECONTROL -#define TQT_NO_SPLITTER -#define TQT_NO_STATUSBAR -#define TQT_NO_TABBAR -#define TQT_NO_TOOLBAR -#define TQT_NO_TOOLTIP -#define TQT_NO_VALIDATOR -#define TQT_NO_WHATSTHIS -#define TQT_NO_WIDGETSTACK -#define TQT_NO_ACCEL -#define TQT_NO_SIZEGRIP -#define TQT_NO_HEADER -#define TQT_NO_WORKSPACE -#define TQT_NO_LCDNUMBER -#define TQT_NO_STYLE_MOTIF -#define TQT_NO_STYLE_PLATINUM -#define TQT_NO_PROGRESSBAR - - -#define TQT_NO_TQWS_HYDRO_WM_STYLE -#define TQT_NO_TQWS_BEOS_WM_STYLE -#define TQT_NO_TQWS_KDE2_WM_STYLE -#define TQT_NO_TQWS_KDE_WM_STYLE -#define TQT_NO_TQWS_WINDOWS_WM_STYLE - - -/* other widgets that could be removed: */ -/* -#define TQT_NO_MENUDATA -*/ - - -/* possible options: */ -/* -#define TQT_NO_CURSOR -#define TQT_NO_LAYOUT -#define TQT_NO_TQWS_MANAGER -#define TQT_NO_TQWS_KEYBOARD -*/ diff --git a/tqtinterface/qt4/src/tools/tqcriticalsection_p.cpp b/tqtinterface/qt4/src/tools/tqcriticalsection_p.cpp deleted file mode 100644 index ed6ead8..0000000 --- a/tqtinterface/qt4/src/tools/tqcriticalsection_p.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQCriticalSection class -** -** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#if defined(TQT_THREAD_SUPPORT) - -#include "tqt_windows.h" - -#include <private/tqcriticalsection_p.h> - -class TQCriticalSectionPrivate -{ -public: - TQCriticalSectionPrivate() {} - - CRITICAL_SECTION section; -}; - - -TQCriticalSection::TQCriticalSection() -{ - d = new TQCriticalSectionPrivate; - InitializeCriticalSection( &d->section ); -} - -TQCriticalSection::~TQCriticalSection() -{ - DeleteCriticalSection( &d->section ); - delete d; -} - -void TQCriticalSection::enter() -{ - EnterCriticalSection( &d->section ); -} - -void TQCriticalSection::leave() -{ - LeaveCriticalSection( &d->section ); -} - -#endif diff --git a/tqtinterface/qt4/src/tools/tqcriticalsection_p.h b/tqtinterface/qt4/src/tools/tqcriticalsection_p.h deleted file mode 100644 index 21d1f6d..0000000 --- a/tqtinterface/qt4/src/tools/tqcriticalsection_p.h +++ /dev/null @@ -1,83 +0,0 @@ -/**************************************************************************** -** -** Definition of TQCriticalSection class -** -** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQCRITICALSECTION_P_H -#define TQCRITICALSECTION_P_H - -#ifndef TQT_H -#endif // TQT_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of TQt Remote Control. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// -// - -#if defined(TQT_THREAD_SUPPORT) - -#if defined(TQ_WS_WIN) - -/* - TQCriticalSection -*/ - -class TQCriticalSectionPrivate; - -class TQCriticalSection -{ -public: - TQCriticalSection(); - ~TQCriticalSection(); - void enter(); - void leave(); - -private: - TQCriticalSectionPrivate *d; -}; - -#endif - -#endif - -#endif diff --git a/tqtinterface/qt4/src/tools/tqcstring.cpp b/tqtinterface/qt4/src/tools/tqcstring.cpp deleted file mode 100644 index be41ebf..0000000 --- a/tqtinterface/qt4/src/tools/tqcstring.cpp +++ /dev/null @@ -1,4149 +0,0 @@ -/**************************************************************************** -** -** Implementation of extended char array operations, and TQByteArray and -** TQCString classes -** -** Created : 920722 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqstring.h" -#include "tqregexp.h" -#include "tqdatastream.h" - -#ifdef TQT_THREAD_SUPPORT -# include <private/tqmutexpool_p.h> -#endif // TQT_THREAD_SUPPORT - -#include <stdio.h> -#include <stdarg.h> -#include <stdlib.h> -#include <ctype.h> -#include <limits.h> -#ifndef TQT_NO_COMPRESS -#include "../3rdparty/zlib/zlib.h" -#endif - -/***************************************************************************** - Safe and portable C string functions; extensions to standard string.h - *****************************************************************************/ - -/*! - \relates TQCString - - This function is normally part of the C library. TQt implements - memmove() for platforms that do not provide it. - - memmove() copies \a len bytes from \a src into \a dst. The data - is copied correctly even if \a src and \a dst overlap. -*/ - -void *tqmemmove( void *dst, const void *src, uint len ) -{ - register char *d; - register char *s; - if ( dst > src ) { - d = (char *)dst + len - 1; - s = (char *)src + len - 1; - while ( len-- ) - *d-- = *s--; - } else if ( dst < src ) { - d = (char *)dst; - s = (char *)src; - while ( len-- ) - *d++ = *s++; - } - return dst; -} - - -/*! - \relates TQCString - - Returns a duplicate string. - - Allocates space for a copy of \a src, copies it, and returns a - pointer to the copy. If \a src is 0, it immediately returns 0. - - The returned string must be deleted using \c delete[]. -*/ - -char *tqstrdup( const char *src ) -{ - if ( !src ) - return 0; - char *dst = new char[strlen(src)+1]; - TQ_CHECK_PTR( dst ); - return strcpy( dst, src ); -} - -/*! - \fn char *qstrcpy( char *dst, const char *src ) - - \relates TQCString - - A safe strcpy() function. - - Copies all characters up to and including the '\0' from \a src - into \a dst and returns a pointer to \a dst. -*/ - -/*! - \relates TQCString - - A safe strncpy() function. - - Copies at most \a len bytes from \a src (stopping at \a len or the - terminating '\0' whichever comes first) into \a dst and returns a - pointer to \a dst. Guarantees that \a dst is '\0'-terminated. If - \a src or \a dst is 0, returns 0 immediately. - - \sa qstrcpy() -*/ - -char *tqstrncpy( char *dst, const char *src, uint len ) -{ - if ( !src || !dst ) - return 0; - strncpy( dst, src, len ); - if ( len > 0 ) - dst[len-1] = '\0'; - return dst; -} - -/*! - \fn uint tqstrlen( const char *str ); - - \relates TQCString - - A safe strlen function. - - Returns the number of characters that precede the terminating '\0'. - or 0 if \a str is 0. -*/ - -/*! - \fn int qstrcmp( const char *str1, const char *str2 ); - - \relates TQCString - - A safe strcmp() function. - - Compares \a str1 and \a str2. Returns a negative value if \a str1 - is less than \a str2, 0 if \a str1 is equal to \a str2 or a - positive value if \a str1 is greater than \a str2. - - Special case I: Returns 0 if \a str1 and \a str2 are both 0. - - Special case II: Returns a random nonzero value if \a str1 is 0 - or \a str2 is 0 (but not both). - - \sa tqstrncmp() qstricmp() qstrnicmp() - \link #asciinotion Note on character comparisons \endlink -*/ - -/*! - \fn int tqstrncmp( const char *str1, const char *str2, uint len ); - - \relates TQCString - - A safe strncmp() function. - - Compares at most \a len bytes of \a str1 and \a str2. - - Returns a negative value if \a str1 is less than \a str2, 0 if \a - str1 is equal to \a str2 or a positive value if \a str1 is greater - than \a str2. - - Special case I: Returns 0 if \a str1 and \a str2 are both 0. - - Special case II: Returns a random nonzero value if \a str1 is 0 - or \a str2 is 0 (but not both). - - \sa qstrcmp(), qstricmp(), qstrnicmp() - \link #asciinotion Note on character comparisons \endlink -*/ - -/*! - \relates TQCString - - A safe stricmp() function. - - Compares \a str1 and \a str2 ignoring the case. - - Returns a negative value if \a str1 is less than \a str2, 0 if \a - str1 is equal to \a str2 or a positive value if \a str1 is greater - than \a str2. - - Special case I: Returns 0 if \a str1 and \a str2 are both 0. - - Special case II: Returns a random nonzero value if \a str1 is 0 - or \a str2 is 0 (but not both). - - \sa qstrcmp(), tqstrncmp(), qstrnicmp() - \link #asciinotion Note on character comparisons \endlink -*/ - -int tqstricmp( const char *str1, const char *str2 ) -{ - register const uchar *s1 = (const uchar *)str1; - register const uchar *s2 = (const uchar *)str2; - int res; - uchar c; - if ( !s1 || !s2 ) - return s1 ? 1 : ( s2 ? -1 : 0 ); - for ( ; !(res = (c=tolower(*s1)) - tolower(*s2)); s1++, s2++ ) - if ( !c ) // strings are equal - break; - return res; -} - -/*! - \relates TQCString - - A safe strnicmp() function. - - Compares at most \a len bytes of \a str1 and \a str2 ignoring the case. - - Returns a negative value if \a str1 is less than \a str2, 0 if \a str1 - is equal to \a str2 or a positive value if \a str1 is greater than \a - str2. - - Special case I: Returns 0 if \a str1 and \a str2 are both 0. - - Special case II: Returns a random nonzero value if \a str1 is 0 - or \a str2 is 0 (but not both). - - \sa qstrcmp(), tqstrncmp() qstricmp() - \link #asciinotion Note on character comparisons \endlink -*/ - -int tqstrnicmp( const char *str1, const char *str2, uint len ) -{ - register const uchar *s1 = (const uchar *)str1; - register const uchar *s2 = (const uchar *)str2; - int res; - uchar c; - if ( !s1 || !s2 ) - return s1 ? 1 : ( s2 ? -1 : 0 ); - for ( ; len--; s1++, s2++ ) { - if ( (res = (c=tolower(*s1)) - tolower(*s2)) ) - return res; - if ( !c ) // strings are equal - break; - } - return 0; -} - - -static TQ_UINT16 crc_tbl[16]; -static bool crc_tbl_init = FALSE; - -static void createCRC16Table() // build CRC16 lookup table -{ - register uint i; - register uint j; - uint v0, v1, v2, v3; - for ( i = 0; i < 16; i++ ) { - v0 = i & 1; - v1 = ( i >> 1 ) & 1; - v2 = ( i >> 2 ) & 1; - v3 = ( i >> 3 ) & 1; - j = 0; -#undef SET_BIT -#define SET_BIT(x, b, v) (x) |= (v) << (b) - SET_BIT( j, 0, v0 ); - SET_BIT( j, 7, v0 ); - SET_BIT( j, 12, v0 ); - SET_BIT( j, 1, v1 ); - SET_BIT( j, 8, v1 ); - SET_BIT( j, 13, v1 ); - SET_BIT( j, 2, v2 ); - SET_BIT( j, 9, v2 ); - SET_BIT( j, 14, v2 ); - SET_BIT( j, 3, v3 ); - SET_BIT( j, 10, v3 ); - SET_BIT( j, 15, v3 ); - crc_tbl[i] = j; - } -} - -/*! - \relates TQMemArray - - Returns the CRC-16 checksum of \a len bytes starting at \a data. - - The checksum is independent of the byte order (endianness). -*/ - -TQ_UINT16 qChecksum( const char *data, uint len ) -{ - if ( !crc_tbl_init ) { // create lookup table - -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker locker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &crc_tbl_init ) : 0 ); -#endif // TQT_THREAD_SUPPORT - - if ( !crc_tbl_init ) { - createCRC16Table(); - crc_tbl_init = TRUE; - } - } - register TQ_UINT16 crc = 0xffff; - uchar c; - uchar *p = (uchar *)data; - while ( len-- ) { - c = *p++; - crc = ( (crc >> 4) & 0x0fff ) ^ crc_tbl[((crc ^ c) & 15)]; - c >>= 4; - crc = ( (crc >> 4) & 0x0fff ) ^ crc_tbl[((crc ^ c) & 15)]; - } - return ~crc & 0xffff; -} - -/*! - \fn TQByteArray tqCompress( const TQByteArray& data ) - - \relates TQByteArray - - Compresses the array \a data and returns the compressed byte - array using zlib. - - \sa tqUncompress() -*/ - -/*! - \relates TQByteArray - - \overload - - Compresses the array \a data which is \a nbytes long and returns the - compressed byte array. -*/ - -#ifndef TQT_NO_COMPRESS -TQByteArray tqCompress( const uchar* data, int nbytes ) -{ - if ( nbytes == 0 ) { - TQByteArray tmp( 4 ); - tmp.fill( 0 ); - return tmp; - } - if ( !data ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "tqCompress: data is NULL." ); -#endif - return TQByteArray(); - } - - ulong len = nbytes + nbytes / 100 + 13; - TQByteArray bazip; - int res; - do { - bazip.resize( len + 4 ); - res = ::compress( (uchar*)bazip.data()+4, &len, (uchar*)data, nbytes ); - - switch ( res ) { - case Z_OK: - bazip.resize( len + 4 ); - bazip[0] = ( nbytes & 0xff000000 ) >> 24; - bazip[1] = ( nbytes & 0x00ff0000 ) >> 16; - bazip[2] = ( nbytes & 0x0000ff00 ) >> 8; - bazip[3] = ( nbytes & 0x000000ff ); - break; - case Z_MEM_ERROR: -#if defined(TQT_CHECK_RANGE) - qWarning( "tqCompress: Z_MEM_ERROR: Not enough memory." ); -#endif - bazip.resize( 0 ); - break; - case Z_BUF_ERROR: - len *= 2; - break; - } - } while ( res == Z_BUF_ERROR ); - - return bazip; -} -#endif - -/*! - \fn TQByteArray tqUncompress( const TQByteArray& data ) - - \relates TQByteArray - - Uncompresses the array \a data and returns the uncompressed byte - array. - - Returns an empty TQByteArray if the input data was corrupt. - \omit - ADD THE FOLLOWING FOR TQt 4.0 - This function will uncompress data compressed with tqCompress() - from this and any earlier TQt version, back to TQt 3.1 when this - feature was added. - \endomit - - \sa tqCompress() -*/ - -/*! - \relates TQByteArray - - \overload - - Uncompresses the array \a data which is \a nbytes long and returns - the uncompressed byte array. -*/ - -#ifndef TQT_NO_COMPRESS -TQByteArray tqUncompress( const uchar* data, int nbytes ) -{ - if ( !data ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "tqUncompress: data is NULL." ); -#endif - return TQByteArray(); - } - if ( nbytes <= 4 ) { -#if defined(TQT_CHECK_RANGE) - if ( nbytes < 4 || ( data[0]!=0 || data[1]!=0 || data[2]!=0 || data[3]!=0 ) ) - qWarning( "tqUncompress: Input data is corrupted." ); -#endif - return TQByteArray(); - } - ulong expectedSize = ( data[0] << 24 ) | ( data[1] << 16 ) | ( data[2] << 8 ) | data[3]; - ulong len = TQMAX( expectedSize, 1 ); - TQByteArray baunzip; - int res; - do { - if ( baunzip.tqresize( len ) ) { - res = ::uncompress( (uchar*)baunzip.data(), &len, - (uchar*)data+4, nbytes-4 ); - } else { - res = Z_MEM_ERROR; - } - - switch ( res ) { - case Z_OK: - if ( len != baunzip.size() ) - baunzip.resize( len ); - break; - case Z_MEM_ERROR: -#if defined(TQT_CHECK_RANGE) - qWarning( "tqUncompress: Z_MEM_ERROR: Not enough memory." ); -#endif - break; - case Z_BUF_ERROR: - len *= 2; - break; - case Z_DATA_ERROR: -#if defined(TQT_CHECK_RANGE) - qWarning( "tqUncompress: Z_DATA_ERROR: Input data is corrupted." ); -#endif - break; - } - } while ( res == Z_BUF_ERROR ); - - if ( res != Z_OK ) - baunzip = TQByteArray(); - - return baunzip; -} -#endif - -/***************************************************************************** - TQByteArray documentation - *****************************************************************************/ - -/*! - \class TQByteArray - \reentrant - \brief The TQByteArray class provides an array of bytes. - - \ingroup collection - \ingroup tools - - The TQByteArray class provides an explicitly shared array of bytes. - It is useful for manipulating memory areas with custom data. - TQByteArray is implemented as a TQMemArray\<char\>. See the \l - TQMemArray documentation for further information. -*/ - -/*! - \fn TQByteArray::TQByteArray() - - Constructs an empty TQByteArray. -*/ - -/*! - \fn TQByteArray::TQByteArray( int size ) - - Constructs a TQByteArray of size \a size. -*/ - -// /***************************************************************************** -// TQByteArray stream functions -// *****************************************************************************/ -// -// /*! -// \relates TQMemArray -// -// Writes byte array \a a to the stream \a s and returns a reference -// to the stream. -// -// \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -// */ -// #ifndef TQT_NO_DATASTREAM -// -// TQDataStream &operator<<( TQDataStream &s, const TQByteArray &a ) -// { -// return s.writeBytes( a.data(), a.size() ); -// } -// -// /*! -// \relates TQMemArray -// -// Reads a byte array into \a a from the stream \a s and returns a -// reference to the stream. -// -// \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -// */ -// -// TQDataStream &operator>>( TQDataStream &s, TQByteArray &a ) -// { -// TQ_UINT32 len; -// s >> len; // read size of array -// if ( len == 0 || s.eof() ) { // end of file reached -// a.resize( 0 ); -// return s; -// } -// if ( !a.resize( (uint)len ) ) { // resize array -// #if defined(TQT_CHECK_NULL) -// qWarning( "TQDataStream: Not enough memory to read TQByteArray" ); -// #endif -// len = 0; -// } -// if ( len > 0 ) // not null array -// s.readRawBytes( a.data(), (uint)len ); -// return s; -// } -// -// #endif //TQT_NO_DATASTREAM - -#ifdef USE_QT4 - -/***************************************************************************** - TQByteArray stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -TQDataStream &operator<<( TQDataStream &d, const TQByteArray &s ) { - if (d.version() >= QDataStream::Qt_4_0) { - QDataStream &qds = operator<<(static_cast<QDataStream &>(d), static_cast<const QByteArray &>(s)); - TQDataStream &tqds = *static_cast<TQDataStream*>(&qds); - return tqds; - } - - // we need to add a NUL to keep compatibility with Qt 3's QByteArray - QByteArray copy = s; - copy.append('\0'); - - QDataStream &qds = operator<<(static_cast<QDataStream &>(d), static_cast<const QByteArray &>(s)); - TQDataStream &tqds = *static_cast<TQDataStream*>(&qds); - return tqds; -} - -TQDataStream &operator>>( TQDataStream &d, TQByteArray &s ) { - operator>>(d, static_cast<QByteArray &>(s)); - if (d.version() < QDataStream::Qt_4_0 && s.endsWith('\0')) - s.chop(1); // ending NUL - return d; -} -#endif // TQT_NO_DATASTREAM - -#endif // USE_QT4 - -#ifdef USE_QT4 - -/*! - \reimp -*/ - -TQByteArray::~TQByteArray() -{ -} - -#endif // USE_QT4 - -/***************************************************************************** - TQCString member functions - *****************************************************************************/ - -// #ifdef USE_QT4 -#if 0 - -QT_BEGIN_NAMESPACE - -/*! - Constructs a string with room for \a size characters, including - the '\0'-terminator. Makes a null string if \a size == 0. - - If \a size \> 0, then the first and last characters in the string - are initialized to '\0'. All other characters are uninitialized. - - \sa resize(), isNull() -*/ - -// TQCString::TQCString( int size ) -// : TQByteArray( size ) -// { -// if ( size > 0 ) { -// *data() = '\0'; // set terminator -// *(data()+(size-1)) = '\0'; -// } -// } - -TQCString::TQCString( int size ) - : TQByteArray(size, '\0') -{ -} - -/*! - Constructs a string that is a deep copy of \a str. - - If \a str is 0 a null string is created. - - \sa isNull() -*/ - -TQCString::TQCString( const char *str ) -{ - duplicate( str, tqstrlen(str) + 1 ); -} - - -/*! - Constructs a string that is a deep copy of \a str. The copy will - be at most \a maxsize bytes long including the '\0'-terminator. - - Example: - \code - TQCString str( "helloworld", 6 ); // assigns "hello" to str - \endcode - - If \a str contains a 0 byte within the first \a maxsize bytes, the - resulting TQCString will be terminated by this 0. If \a str is 0 a - null string is created. - - \sa isNull() -*/ - -TQCString::TQCString( const char *str, uint maxsize ) -{ - if ( str == 0 ) - return; - uint len; // index of first '\0' - for ( len = 0; len < maxsize - 1; len++ ) { - if ( str[len] == '\0' ) - break; - } - TQByteArray::tqresize( len + 1 ); - memcpy( data(), str, len ); - data()[len] = 0; -} - -// TQCString(int size) : TQByteArray(size, '\0') {} -// TQCString(const char *str) : TQByteArray(str) {} -// TQCString(const char *str, uint maxlen) : TQByteArray(str, qMin(tqstrlen(str), maxlen - 1)) {} -// // TQCString(const char *str, uint maxlen) : TQByteArray(str, TQMIN(tqstrlen(str)+1, maxlen)) {} // This would seem to be more correct at first glance, however it completely breaks tdeconfig_compiler. As to why, I don't know!!! [FIXME] - -TQCString &TQCString::operator=(const TQCString &s) { - TQByteArray::operator=(s); - return *this; -} - -TQCString &TQCString::operator=(const char *str) { -// TQByteArray::operator=(str); return *this; - TQByteArray::operator=(duplicate( str, tqstrlen(str)+1 )); - return *this; -} - -TQCString &TQCString::operator=(const QByteArray &ba) { - TQByteArray::operator=(ba); - return *this; -} - -/***************************************************************************** - TQCString member functions - *****************************************************************************/ - -/*! - \class TQCString - \reentrant - \brief The TQCString class provides an abstraction of the classic C - zero-terminated char array (char *). - - \compat - - TQCString tries to behave like a more convenient \c{const char *}. - The price of doing this is that some algorithms will perform - badly. For example, append() is O(length()) since it scans for a - null terminator. Although you might use TQCString for text that is - never exposed to the user, for most purposes, and especially for - user-visible text, you should use QString. QString provides - implicit sharing, Unicode and other internationalization support, - and is well optimized. - - Note that for the TQCString methods that take a \c{const char *} - parameter the \c{const char *} must either be 0 (null) or not-null - and '\0' (NUL byte) terminated; otherwise the results are - undefined. - - A default constructed TQCString is \e null, i.e. both the length - and the data pointer are 0 and isNull() returns true. - - \note However, if you ask for the data pointer of a null TQCString - by calling data(), then because the internal representation of the - null TQCString is shared, it will be detached and replaced with a - non-shared, empty representation, a non-null data pointer will be - returned, and subsequent calls to isNull() will return false. But - if you ask for the data pointer of a null TQCString by calling - constData(), the shared internal representation is not detached, a - null data pointer is returned, and subsequent calls to isNull() - will continue to return true. - - A TQCString that references the empty string ("", a single '\0' - char) is \e empty, i.e. isEmpty() returns true. Both null and - empty TQCStrings are legal parameters to the methods. Assigning - \c{const char *} 0 to TQCString produces a null TQCString. - - The length() function returns the length of the string; resize() - resizes the string and truncate() truncates the string. A string - can be filled with a character using fill(). Strings can be left - or right padded with characters using leftJustify() and - rightJustify(). Characters, strings and regular expressions can be - searched for using find() and findRev(), and counted using - contains(). - - Strings and characters can be inserted with insert() and appended - with append(). A string can be prepended with prepend(). - Characters can be removed from the string with remove() and - replaced with replace(). - - Portions of a string can be extracted using left(), right() and - mid(). Whitespace can be removed using stripWhiteSpace() and - simplifyWhiteSpace(). Strings can be converted to uppercase or - lowercase with upper() and lower() respectively. - - Strings that contain numbers can be converted to numbers with - toShort(), toInt(), toLong(), toULong(), toFloat() and toDouble(). - Numbers can be converted to strings with setNum(). - - Many operators are overloaded to work with TQCStrings. TQCString - also supports some more obscure functions, e.g. sprintf(), - setStr() and setExpand(). - - \sidebar Note on Character Comparisons - - In TQCString the notion of uppercase and lowercase and of which - character is greater than or less than another character is locale - dependent. This affects functions which support a case insensitive - option or which compare or lowercase or uppercase their arguments. - Case insensitive operations and comparisons will be accurate if - both strings contain only ASCII characters. (If \c $LC_CTYPE is - set, most Unix systems do "the right thing".) Functions that this - affects include contains(), find(), findRev(), \l operator<(), \l - operator<=(), \l operator>(), \l operator>=(), lower() and - upper(). - - This issue does not apply to \l{QString}s since they represent - characters using Unicode. - \endsidebar - - Performance note: The TQCString methods for QRegExp searching are - implemented by converting the TQCString to a QString and performing - the search on that. This implies a deep copy of the TQCString data. - If you are going to perform many QRegExp searches on a large - TQCString, you will get better performance by converting the - TQCString to a QString yourself, and then searching in the QString. -*/ - -/*! - \fn TQCString TQCString::left(uint len) const - - \internal -*/ - -/*! - \fn TQCString TQCString::right(uint len) const - - \internal -*/ - -/*! - \fn TQCString TQCString::mid(uint index, uint len) const - - \internal -*/ - -/*! - \fn TQCString TQCString::lower() const - - Use QByteArray::toLower() instead. -*/ - -/*! - \fn TQCString TQCString::upper() const - - Use QByteArray::toUpper() instead. -*/ - -/*! - \fn TQCString TQCString::stripWhiteSpace() const - - Use QByteArray::trimmed() instead. -*/ - -/*! - \fn TQCString TQCString::simplifyWhiteSpace() const - - Use QByteArray::simplified() instead. -*/ - -/*! - \fn TQCString& TQCString::insert(uint index, const char *c) - - \internal -*/ - -/*! - \fn TQCString& TQCString::insert(uint index, char c) - - \internal -*/ - -/*! - \fn TQCString& TQCString::prepend(const char *c) - - \internal -*/ - -/*! - \fn TQCString& TQCString::remove(uint index, uint len) - - \internal -*/ - -/*! - \fn TQCString& TQCString::replace(uint index, uint len, const char *c) - - \internal -*/ - -/*! - \fn TQCString& TQCString::replace(char c, const TQCString &after) - - \internal -*/ - -/*! - \fn TQCString& TQCString::replace(char c, const char *after) - - \internal -*/ - -/*! - \fn TQCString& TQCString::replace(const TQCString &b, const TQCString &a) - - \internal -*/ - -/*! - \fn TQCString& TQCString::replace(const char *b, const char *a) - - \internal -*/ - -/*! - \fn TQCString& TQCString::replace(char b, char a) - - \internal -*/ - -/*! - \fn TQCString::TQCString() - - Constructs a null string. - - \sa isNull() -*/ - -/*! - \fn TQCString::TQCString(const QByteArray &ba) - - Constructs a copy of \a ba. -*/ - -/*! - \fn TQCString::TQCString(const TQCString &s) - - Constructs a shallow copy \a s. -*/ - -/*! \fn TQCString::TQCString(int size) - Constructs a string with room for \a size characters, including - the '\0'-terminator. Makes a null string if \a size == 0. - - If \a size \> 0, then the first and last characters in the string - are initialized to '\0'. All other characters are uninitialized. - - \sa resize(), isNull() -*/ - -/*! \fn TQCString::TQCString(const char *str) - Constructs a string that is a deep copy of \a str. - - If \a str is 0 a null string is created. - - \sa isNull() -*/ - - -/*! \fn TQCString::TQCString(const char *str, uint maxsize) - - Constructs a string that is a deep copy of \a str. The copy will - be at most \a maxsize bytes long including the '\0'-terminator. - - Example: - \snippet doc/src/snippets/code/src_qt3support_tools_q3cstring.cpp 0 - - If \a str contains a 0 byte within the first \a maxsize bytes, the - resulting TQCString will be terminated by this 0. If \a str is 0 a - null string is created. - - \sa isNull() -*/ - -/*! - \fn TQCString &TQCString::operator=(const QByteArray &ba) - - Assigns byte array \a ba to this TQCString. -*/ - -/*! - \fn TQCString &TQCString::operator=(const TQCString &s) - - Assigns a shallow copy of \a s to this string and returns a - reference to this string. -*/ - -/*! - \fn TQCString &TQCString::operator=(const char *str) - \overload - - Assigns a deep copy of \a str to this string and returns a - reference to this string. - - If \a str is 0 a null string is created. - - \sa isNull() -*/ - -/* - \fn bool TQCString::isNull() const - - Returns true if the string is null, i.e. if data() == 0; otherwise - returns false. A null string is also an empty string. - - \note If you ask for the data pointer of a null TQCString by - calling data(), then because the internal representation of the - null TQCString is shared, it will be detached and replaced with a - non-shared, empty representation, a non-null data pointer will be - returned, and subsequent calls to isNull() will return false. But - if you ask for the data pointer of a null TQCString by calling - constData(), the shared internal representation is not detached, a - null data pointer is returned, and subsequent calls to isNull() - will continue to return true. - - Example: - \snippet doc/src/snippets/code/src.qt3support.tools.q3cstring.cpp 1 - - \sa isEmpty(), length(), size() -*/ - -/* - \fn bool TQCString::isEmpty() const - - Returns true if the string is empty, i.e. if length() == 0; - otherwise returns false. An empty string is not always a null - string. - - See example in isNull(). - - \sa isNull(), length(), size() -*/ - -/* - \fn uint TQCString::length() const - - Returns the length of the string, excluding the '\0'-terminator. - Equivalent to calling \c strlen(data()). - - Null strings and empty strings have zero length. - - \sa size(), isNull(), isEmpty() -*/ - -/* - \fn bool TQCString::truncate(uint pos) - - Truncates the string at position \a pos. - - Equivalent to calling \c resize(pos+1). - - Example: - \snippet doc/src/snippets/code/src.qt3support.tools.q3cstring.cpp 2 - - \sa resize() -*/ - -/*! - \reimp -*/ - -TQCString::~TQCString() -{ -} - -/*! - Implemented as a call to the native vsprintf() (see the manual for - your C library). - - If the string is shorter than 256 characters, this sprintf() calls - resize(256) to decrease the chance of memory corruption. The - string is resized back to its actual length before sprintf() - returns. - - Example: - \snippet doc/src/snippets/code/src_qt3support_tools_q3cstring.cpp 3 - - \warning All vsprintf() implementations will write past the end of - the target string (*this) if the \a format specification and - arguments happen to be longer than the target string, and some - will also fail if the target string is longer than some arbitrary - implementation limit. - - Giving user-supplied arguments to sprintf() is risky: Sooner or - later someone will paste a huge line into your application. -*/ - -TQCString &TQCString::sprintf(const char *format, ...) -{ - detach(); - va_list ap; - va_start(ap, format); - if (size() < 256) - resize(256); // make string big enough - qvsnprintf(data(), size(), format, ap); - resize(qstrlen(constData())); - va_end(ap); - return *this; -} - - - -/*! - \fn TQCString TQCString::copy() const - - Returns a deep copy of this string. -*/ - - -/*! - Returns a string of length \a width (plus one for the terminating - '\0') that contains this string padded with the \a fill character. - - If the length of the string exceeds \a width and \a truncate is - false (the default), then the returned string is a copy of the - string. If the length of the string exceeds \a width and \a - truncate is true, then the returned string is a left(\a width). - - Example: - \snippet doc/src/snippets/code/src_qt3support_tools_q3cstring.cpp 4 - - \sa rightJustify() -*/ - -TQCString TQCString::leftJustify(uint width, char fill, bool truncate) const -{ - TQCString result; - int len = qstrlen(constData()); - int padlen = width - len; - if (padlen > 0) { - result.resize(len+padlen); - memcpy(result.data(), constData(), len); - memset(result.data()+len, fill, padlen); - } else { - if (truncate) - result = left(width); - else - result = *this; - } - return result; -} - -/*! - Returns a string of length \a width (plus one for the terminating - '\0') that contains zero or more of the \a fill character followed - by this string. - - If the length of the string exceeds \a width and \a truncate is - false (the default), then the returned string is a copy of the - string. If the length of the string exceeds \a width and \a - truncate is true, then the returned string is a left(\a width). - - Example: - \snippet doc/src/snippets/code/src_qt3support_tools_q3cstring.cpp 5 - - \sa leftJustify() -*/ - -TQCString TQCString::rightJustify(uint width, char fill, bool truncate) const -{ - TQCString result; - int len = qstrlen(constData()); - int padlen = width - len; - if (padlen > 0) { - result.resize(len+padlen); - memset(result.data(), fill, padlen); - memcpy(result.data()+padlen, constData(), len); - } else { - if (truncate) - result = left(width); - else - result = *this; - } - return result; -} - -/*! - Returns the string converted to a \c long value. - - If \a ok is not 0: *\a ok is set to false if the string is not a - number, or if it has trailing garbage; otherwise *\a ok is set to - true. -*/ - -long TQCString::toLong(bool *ok) const -{ - const char *p = constData(); - long val=0; - const long max_mult = 214748364; - bool is_ok = false; - int neg = 0; - if (!p) - goto bye; - while (isspace((uchar) *p)) // skip leading space - p++; - if (*p == '-') { - p++; - neg = 1; - } else if (*p == '+') { - p++; - } - if (!isdigit((uchar) *p)) - goto bye; - while (isdigit((uchar) *p)) { - if (val > max_mult || (val == max_mult && (*p-'0') > 7+neg)) - goto bye; - val = 10*val + (*p++ - '0'); - } - if (neg) - val = -val; - while (isspace((uchar) *p)) // skip trailing space - p++; - if (*p == '\0') - is_ok = true; -bye: - if (ok) - *ok = is_ok; - return is_ok ? val : 0; -} - -/*! - Returns the string converted to an \c{unsigned long} value. - - If \a ok is not 0: *\a ok is set to false if the string is not a - number, or if it has trailing garbage; otherwise *\a ok is set to - true. -*/ - -ulong TQCString::toULong(bool *ok) const -{ - const char *p = constData(); - ulong val=0; - const ulong max_mult = 429496729; - bool is_ok = false; - if (!p) - goto bye; - while (isspace((uchar) *p)) // skip leading space - p++; - if (*p == '+') - p++; - if (!isdigit((uchar) *p)) - goto bye; - while (isdigit((uchar) *p)) { - if (val > max_mult || (val == max_mult && (*p-'0') > 5)) - goto bye; - val = 10*val + (*p++ - '0'); - } - while (isspace((uchar) *p)) // skip trailing space - p++; - if (*p == '\0') - is_ok = true; -bye: - if (ok) - *ok = is_ok; - return is_ok ? val : 0; -} - -/*! - Returns the string converted to a \c{short} value. - - If \a ok is not 0: *\a ok is set to false if the string is not a - number, is out of range, or if it has trailing garbage; otherwise - *\a ok is set to true. -*/ - -short TQCString::toShort(bool *ok) const -{ - long v = toLong(ok); - if (ok && *ok && (v < -32768 || v > 32767)) - *ok = false; - return (short)v; -} - -/*! - Returns the string converted to an \c{unsigned short} value. - - If \a ok is not 0: *\a ok is set to false if the string is not a - number, is out of range, or if it has trailing garbage; otherwise - *\a ok is set to true. -*/ - -ushort TQCString::toUShort(bool *ok) const -{ - ulong v = toULong(ok); - if (ok && *ok && (v > 65535)) - *ok = false; - return (ushort)v; -} - - -/*! - Returns the string converted to a \c{int} value. - - If \a ok is not 0: *\a ok is set to false if the string is not a - number, or if it has trailing garbage; otherwise *\a ok is set to - true. -*/ - -int TQCString::toInt(bool *ok) const -{ - return (int)toLong(ok); -} - -/*! - Returns the string converted to an \c{unsigned int} value. - - If \a ok is not 0: *\a ok is set to false if the string is not a - number, or if it has trailing garbage; otherwise *\a ok is set to - true. -*/ - -uint TQCString::toUInt(bool *ok) const -{ - return (uint)toULong(ok); -} - -/*! - Returns the string converted to a \c{double} value. - - If \a ok is not 0: *\a ok is set to false if the string is not a - number, or if it has trailing garbage; otherwise *\a ok is set to - true. -*/ - -double TQCString::toDouble(bool *ok) const -{ - char *end; - double val = strtod(constData() ? constData() : "", &end); - if (ok) - *ok = (constData() && *constData() && (end == 0 || *end == '\0')); - return val; -} - -/*! - Returns the string converted to a \c{float} value. - - If \a ok is not 0: *\a ok is set to false if the string is not a - number, or if it has trailing garbage; otherwise *\a ok is set to - true. -*/ - -float TQCString::toFloat(bool *ok) const -{ - return (float)toDouble(ok); -} - - -/*! \fn TQCString &TQCString::setStr(const char *str) - Makes a deep copy of \a str. Returns a reference to the string. -*/ - -/*! - \overload - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -TQCString &TQCString::setNum(long n) -{ - data(); - char buf[20]; - register char *p = &buf[19]; - bool neg; - if (n < 0) { - neg = true; - n = -n; - } else { - neg = false; - } - *p = '\0'; - do { - *--p = ((int)(n%10)) + '0'; - n /= 10; - } while (n); - if (neg) - *--p = '-'; - *this = p; - return *this; -} - -/*! - \overload - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -TQCString &TQCString::setNum(ulong n) -{ - data(); - char buf[20]; - register char *p = &buf[19]; - *p = '\0'; - do { - *--p = ((int)(n%10)) + '0'; - n /= 10; - } while (n); - *this = p; - return *this; -} - -/*! - \fn TQCString &TQCString::setNum(int n) - \overload - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -/*! - \fn TQCString &TQCString::setNum(uint n) - \overload - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -/*! - \fn TQCString &TQCString::setNum(short n) - \overload - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -/*! - \fn TQCString &TQCString::setNum(ushort n) - \overload - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -/*! - Sets the string to the string representation of the number \a n - and returns a reference to the string. - - The format of the string representation is specified by the format - character \a f, and the precision (number of digits after the - decimal point) is specified with \a prec. - - The valid formats for \a f are 'e', 'E', 'f', 'g' and 'G'. The - formats are the same as for sprintf(); they are explained in \l - QString::arg(). -*/ - -TQCString &TQCString::setNum(double n, char f, int prec) -{ -#ifndef QT_NO_DEBUG - if (!(f=='f' || f=='F' || f=='e' || f=='E' || f=='g' || f=='G')) - qWarning("TQCString::setNum: Invalid format char '%c'", f); -#endif - char format[20]; - register char *fs = format; // generate format string - *fs++ = '%'; // "%.<prec>l<f>" - if (prec > 99) - prec = 99; - *fs++ = '.'; - if (prec >= 10) { - *fs++ = prec / 10 + '0'; - *fs++ = prec % 10 + '0'; - } else { - *fs++ = prec + '0'; - } - *fs++ = 'l'; - *fs++ = f; - *fs = '\0'; - return sprintf(format, n); -} - -/*! \fn TQCString &TQCString::setNum(float n, char f, int prec) - \overload -*/ - -/*! - Sets the character at position \a index to \a c and expands the - string if necessary, padding with spaces. - - Returns false if \a index was out of range and the string could - not be expanded; otherwise returns true. -*/ - -bool TQCString::setExpand(uint index, char c) -{ - uint oldlen = length(); - if (index >= oldlen) { - resize(index+1); - if (index > oldlen) - memset(data() + oldlen, ' ', index - oldlen); - } - *(data() + index) = c; - return true; -} - - -/* - \fn TQCString::operator const char *() const - - Returns the string data. -*/ - - -/*! - \fn TQCString& TQCString::append(const char *str) - - Appends string \a str to the string and returns a reference to the - string. Equivalent to operator+=(). -*/ - -#ifndef QT_NO_DATASTREAM -/*! \fn QDataStream &operator<<(QDataStream &s, const TQCString &str) - \relates TQCString - - Writes string \a str to the stream \a s. - - \sa \link datastreamformat.html Format of the QDataStream operators \endlink -*/ -QDataStream &operator<<(QDataStream &d, const TQCString &s) -{ -printf("[WARNING] When using << on a QDataStream instead of a TQDataStream functionality may differ from Qt3\n\r"); - if (d.version() >= QDataStream::Qt_4_0) - return operator<<(d, static_cast<const QByteArray &>(s)); - - // we need to add a NUL to keep compatibility with Qt 3's QByteArray - QByteArray copy = s; - copy.append('\0'); - return operator<<(d, copy); -} - -/*! - \fn QDataStream &operator>>(QDataStream &s, TQCString &str) - \relates TQCString - - Reads a string into \a str from the stream \a s. - - \sa \link datastreamformat.html Format of the QDataStream operators \endlink -*/ -QDataStream &operator>>(QDataStream &d, TQCString &s) { -printf("[WARNING] When using << on a QDataStream instead of a TQDataStream functionality may differ from Qt3\n\r"); - operator>>(d, static_cast<QByteArray &>(s)); - if (d.version() < QDataStream::Qt_4_0 && s.endsWith('\0')) - s.chop(1); // ending NUL - return d; -} - -#if 0 -// I don't think this works... - -/*! \fn TQDataStream &operator<<(TQDataStream &s, const TQCString &str) - \relates TQCString - - Writes string \a str to the stream \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ -TQDataStream &operator<<(TQDataStream &d, const TQCString &s) -{ - if (d.version() >= QDataStream::Qt_4_0) { - QDataStream &qds = operator<<(static_cast<QDataStream &>(d), static_cast<const QByteArray &>(s)); - TQDataStream &tqds = *static_cast<TQDataStream*>(&qds); - return tqds; - } - - // we need to add a NUL to keep compatibility with Qt 3's QByteArray - QByteArray copy = s; - copy.append('\0'); - - QDataStream &qds = operator<<(static_cast<QDataStream &>(d), static_cast<const QByteArray &>(s)); - TQDataStream &tqds = *static_cast<TQDataStream*>(&qds); - return tqds; -} - -/*! - \fn TQDataStream &operator>>(TQDataStream &s, TQCString &str) - \relates TQCString - - Reads a string into \a str from the stream \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ -TQDataStream &operator>>(TQDataStream &d, TQCString &s) { - operator>>(d, static_cast<QByteArray &>(s)); - if (d.version() < QDataStream::Qt_4_0 && s.endsWith('\0')) - s.chop(1); // ending NUL - return d; -} - -#endif - -#endif - -/***************************************************************************** - TQCString stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -/*! - \relates TQCString - - Writes string \a str to the stream \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ -TQDataStream &operator<<( TQDataStream &s, const TQCString &str ) -{ - return static_cast<TQDataStream &>(s.writeBytes( str.data(), str.size() )); -} - -/*! - \relates TQCString - - Reads a string into \a str from the stream \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator>>( TQDataStream &s, TQCString &str ) -{ - str.detach(); - TQ_UINT32 len; - s >> len; // read size of string - if ( len == 0 || s.eof() ) { // end of file reached - str.resize( 0 ); - return s; - } - if ( !str.TQByteArray::tqresize( (uint)len )) {// resize string -#if defined(TQT_CHECK_NULL) - qWarning( "TQDataStream: Not enough memory to read TQCString" ); -#endif - len = 0; - } - if ( len > 0 ) // not null array - s.readRawBytes( str.data(), (uint)len ); - return s; -} -#endif //TQT_NO_DATASTREAM - -/***************************************************************************** - Documentation for related functions - *****************************************************************************/ - -/*! - \fn bool operator==(const TQCString &s1, const TQCString &s2) - - \relates TQCString - - Returns true if \a s1 and \a s2 are equal; otherwise returns false. - - Equivalent to qstrcmp(\a s1, \a s2) == 0. -*/ - -/*! - \fn bool operator==(const TQCString &s1, const char *s2) - \overload - - \relates TQCString - - Returns true if \a s1 and \a s2 are equal; otherwise returns false. - - Equivalent to qstrcmp(\a s1, \a s2) == 0. -*/ - -/*! - \fn bool operator==(const char *s1, const TQCString &s2) - \overload - - \relates TQCString - - Returns true if \a s1 and \a s2 are equal; otherwise returns false. - - Equivalent to qstrcmp(\a s1, \a s2) == 0. -*/ - -/*! - \fn bool operator!=(const TQCString &s1, const TQCString &s2) - - \relates TQCString - - Returns true if \a s1 and \a s2 are different; otherwise returns false. - - Equivalent to qstrcmp(\a s1, \a s2) != 0. -*/ - -/*! - \fn bool operator!=(const TQCString &s1, const char *s2) - \overload - - \relates TQCString - - Returns true if \a s1 and \a s2 are different; otherwise returns false. - - Equivalent to qstrcmp(\a s1, \a s2) != 0. -*/ - -/*! - \fn bool operator!=(const char *s1, const TQCString &s2) - \overload - - \relates TQCString - - Returns true if \a s1 and \a s2 are different; otherwise returns false. - - Equivalent to qstrcmp(\a s1, \a s2) != 0. -*/ - -/*! - \fn bool operator<(const TQCString &s1, const char *s2) - - \relates TQCString - - Returns true if \a s1 is less than \a s2; otherwise returns false. - - Equivalent to qstrcmp(\a s1, \a s2) \< 0. -*/ - -/*! - \fn bool operator<(const char *s1, const TQCString &s2) - \overload - - \relates TQCString - - Returns true if \a s1 is less than \a s2; otherwise returns false. - - Equivalent to qstrcmp(\a s1, \a s2) \< 0. -*/ - -/*! - \fn bool operator<=(const TQCString &s1, const char *s2) - - \relates TQCString - - Returns true if \a s1 is less than or equal to \a s2; otherwise - returns false. - - Equivalent to qstrcmp(\a s1, \a s2) \<= 0. -*/ - -/*! - \fn bool operator<=(const char *s1, const TQCString &s2) - \overload - - \relates TQCString - - Returns true if \a s1 is less than or equal to \a s2; otherwise - returns false. - - Equivalent to qstrcmp(\a s1, \a s2) \<= 0. -*/ - -/*! - \fn bool operator>(const TQCString &s1, const char *s2) - - \relates TQCString - - Returns true if \a s1 is greater than \a s2; otherwise returns false. - - Equivalent to qstrcmp(\a s1, \a s2) \> 0. -*/ - -/*! - \fn bool operator>(const char *s1, const TQCString &s2) - \overload - - \relates TQCString - - Returns true if \a s1 is greater than \a s2; otherwise returns false. - - Equivalent to qstrcmp(\a s1, \a s2) \> 0. -*/ - -/*! - \fn bool operator>=(const TQCString &s1, const char *s2) - - \relates TQCString - - Returns true if \a s1 is greater than or equal to \a s2; otherwise - returns false. - - Equivalent to qstrcmp(\a s1, \a s2) \>= 0. -*/ - -/*! - \fn bool operator>=(const char *s1, const TQCString &s2) - \overload - - \relates TQCString - - Returns true if \a s1 is greater than or equal to \a s2; otherwise - returns false. - - Equivalent to qstrcmp(\a s1, \a s2) \>= 0. -*/ - -/*! - \fn const TQCString operator+(const TQCString &s1, const TQCString &s2) - - \relates TQCString - - Returns a string which consists of the concatenation of \a s1 and - \a s2. -*/ - -/*! - \fn const TQCString operator+(const TQCString &s1, const char *s2) - \overload - - \relates TQCString - - Returns a string which consists of the concatenation of \a s1 and \a s2. -*/ - -/*! - \fn const TQCString operator+(const char *s1, const TQCString &s2) - \overload - - \relates TQCString - - Returns a string which consists of the concatenation of \a s1 and \a s2. -*/ - -/*! - \fn const TQCString operator+(const TQCString &s, char c) - \overload - - \relates TQCString - - Returns a string which consists of the concatenation of \a s and \a c. -*/ - -/*! - \fn const TQCString operator+(char c, const TQCString &s) - \overload - - \relates TQCString - Returns a string which consists of the concatenation of \a c and \a s. -*/ - -/*! - Returns the number of times the character \a c occurs in the - string. - - The match is case sensitive if \a cs is TRUE, or case insensitive - if \a cs if FALSE. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -int TQCString::contains( char c, bool cs ) const -{ - int count = 0; - const char *d = data(); - if ( !d ) - return 0; - if ( cs ) { // case sensitive - while ( *d ) - if ( *d++ == c ) - count++; - } else { // case insensitive - c = tolower( (uchar) c ); - while ( *d ) { - if ( tolower((uchar) *d) == c ) - count++; - d++; - } - } - return count; -} - -/*! - \overload - - Counts the number of overlapping occurrences of \a rx in the string. - - Example: - \code - TQString s = "banana and panama"; - TQRegExp r = TQRegExp( "a[nm]a", TRUE, FALSE ); - s.contains( r ); // 4 matches - \endcode - - \sa find(), findRev() - - \warning If you want to apply this function repeatedly to the same - string it is more efficient to convert the string to a TQString and - apply the function to that. -*/ - -int TQCString::contains( const QRegExp &rx ) const -{ - TQString d = TQString::fromAscii( data() ); - return d.contains( rx ); -} - -/*! - \overload - - Returns the number of times \a str occurs in the string. - - The match is case sensitive if \a cs is TRUE, or case insensitive - if \a cs if FALSE. - - This function counts overlapping substrings, for example, "banana" - contains two occurrences of "ana". - - \sa findRev() - \link #asciinotion Note on character comparisons \endlink -*/ - -int TQCString::contains( const char *str, bool cs ) const -{ - int count = 0; - int i = -1; - uint l = length(); - // use find for the faster hashing algorithm - while ( ( i = find ( str, i+1, cs, l ) ) != -1 ) - count++; - return count; -} - -#define REHASH( a ) \ - if ( sl_minus_1 < sizeof(uint) * CHAR_BIT ) \ - hashHaystack -= (a) << sl_minus_1; \ - hashHaystack <<= 1 - -/*! - Finds the first occurrence of the character \a c, starting at - position \a index. - - The search is case sensitive if \a cs is TRUE, or case insensitive - if \a cs is FALSE. - - Returns the position of \a c, or -1 if \a c could not be found. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -int TQCString::find( char c, int index, bool cs ) const -{ - if ( (uint)index >= size() ) // index outside string - return -1; - register const char *d; - if ( cs ) { // case sensitive - d = strchr( data()+index, c ); - } else { - d = data()+index; - c = tolower( (uchar) c ); - while ( *d && tolower((uchar) *d) != c ) - d++; - if ( !*d && c ) // not found - d = 0; - } - return d ? (int)(d - data()) : -1; -} - -/*! - \overload - - Finds the first occurrence of the string \a str, starting at - position \a index. - - The search is case sensitive if \a cs is TRUE, or case insensitive - if \a cs is FALSE. - - Returns the position of \a str, or -1 if \a str could not be - found. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -int TQCString::find( const char *str, int index, bool cs ) const -{ - return find( str, index, cs, length() ); -} - -#ifndef TQT_NO_REGEXP_CAPTURE -/*! - \overload - - Finds the first occurrence of the regular expression \a rx, - starting at position \a index. - - Returns the position of the next match, or -1 if \a rx was not - found. - - \warning If you want to apply this function repeatedly to the same - string it is more efficient to convert the string to a TQString and - apply the function to that. -*/ - -int TQCString::find( const QRegExp& rx, int index ) const -{ - TQString d = TQString::fromAscii( data() ); - return d.find( rx, index ); -} -#endif // TQT_NO_REGEXP_CAPTURE - -int TQCString::find( const char *str, int index, bool cs, uint l ) const -{ - if ( (uint)index >= size() ) - return -1; - if ( !str ) - return -1; - if ( !*str ) - return index; - const uint sl = tqstrlen( str ); - if ( sl + index > l ) - return -1; - - if ( sl == 1 ) - return find( *str, index, cs ); - - /* - See TQString::find() for details. - */ - const char* needle = str; - const char* haystack = data() + index; - const char* end = data() + (l-sl); - const uint sl_minus_1 = sl-1; - uint hashNeedle = 0, hashHaystack = 0,i; - - if ( cs ) { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + needle[i] ); - hashHaystack = ((hashHaystack<<1) + haystack[i] ); - } - hashHaystack -= *(haystack+sl_minus_1); - - while ( haystack <= end ) { - hashHaystack += *(haystack+sl_minus_1); - if ( hashHaystack == hashNeedle && *needle == *haystack - && tqstrncmp( needle, haystack, sl ) == 0 ) - return haystack - data(); - - REHASH( *haystack ); - ++haystack; - } - } else { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + - tolower( needle[i] ) ); - hashHaystack = ((hashHaystack<<1) + - tolower( haystack[i] ) ); - } - hashHaystack -= tolower(*(haystack+sl_minus_1)); - - while ( haystack <= end ) { - hashHaystack += tolower(*(haystack+sl_minus_1)); - if ( hashHaystack == hashNeedle - && qstrnicmp( needle, haystack, sl ) == 0 ) - return haystack - data(); - - REHASH( tolower(*haystack) ); - ++haystack; - } - } - return -1; -} - -#ifndef TQT_NO_REGEXP -/*! - \overload - - Replaces every occurrence of \a rx in the string with \a str. - Returns a reference to the string. - - Example: - \code - TQString s = "banana"; - s.replace( TQRegExp("a.*a"), "" ); // becomes "b" - - s = "banana"; - s.replace( TQRegExp("^[bn]a"), "X" ); // becomes "Xnana" - - s = "banana"; - s.replace( TQRegExp("^[bn]a"), "" ); // becomes "nana" - \endcode - - \warning If you want to apply this function repeatedly to the same - string it is more efficient to convert the string to a TQString and - apply the function to that. -*/ - -TQCString &TQCString::replace( const QRegExp &rx, const char *str ) -{ - TQString d = TQString::fromAscii( data() ); - TQString r = TQString::fromAscii( str ); - d.replace( rx, r ); - setStr( d.ascii() ); - return *this; -} -#endif //TQT_NO_REGEXP - -/*! - Appends string \a str to the string and returns a reference to the string. -*/ - -TQCString& TQCString::operator+=( const char *str ) -{ -// if ( !str ) -// return *this; // nothing to append -// detach(); -// uint len1 = length(); -// uint len2 = tqstrlen(str); -// if ( !TQByteArray::tqresize( len1 + len2 + 1 ) ) -// return *this; // no memory -// memcpy( data() + len1, str, len2 + 1 ); -// return *this; - - uint len2 = tqstrlen(QByteArray::constData()); - QByteArray::tqresize(len2); // Get rid of the old null terminator - QByteArray::append(str); - return *this; -} - -/*! - \overload - - Appends character \a c to the string and returns a reference to the string. -*/ - -TQCString &TQCString::operator+=( char c ) -{ -// detach(); -// uint len = length(); -// if ( !TQByteArray::tqresize( len + 2 ) ) -// return *this; // no memory -// *(data() + len) = c; -// *(data() + len+1) = '\0'; -// return *this; - - uint len2 = tqstrlen(QByteArray::constData()); - QByteArray::tqresize(len2); // Get rid of the old null terminator - QByteArray::append(c); - return *this; -} - -TQCString& TQCString::operator+=( const QString qs ) -{ - uint len2 = tqstrlen(QByteArray::constData()); - QByteArray::tqresize(len2); // Get rid of the old null terminator - QByteArray tmp = qs.toAscii(); - return append(tmp); -} - -TQCString& TQCString::operator+=( const QByteArray qba ) -{ - uint len2 = tqstrlen(QByteArray::constData()); - QByteArray::tqresize(len2); // Get rid of the old null terminator - return append(qba); -} - -TQCString& TQCString::operator+=( const TQCString tqcs ) { - return operator+=(tqcs.constData()); -} - -QT_END_NAMESPACE - -#else // USE_QT4 - -/*! - \class TQCString tqcstring.h - \reentrant - \brief The TQCString class provides an abstraction of the classic C - zero-terminated char array (char *). - - \ingroup text - \ingroup collection - \ingroup tools - \ingroup shared - - TQCString inherits TQByteArray, which is defined as - TQMemArray\<char\>. Since TQCString is a TQMemArray, it uses \link - shclass.html explicit sharing\endlink with a reference count. - - TQCString tries to behave like a more convenient \c{const char *}. - The price of doing this is that some algorithms will perform - badly. For example, append() is O(length()) since it scans for a - null terminator. Although you might use TQCString for text that is - never exposed to the user, for most purposes, and especially for - user-visible text, you should use TQString. TQString provides - implicit sharing, Unicode and other internationalization support, - and is well optimized. - - Note that for the TQCString methods that take a \c{const char *} - parameter the \c{const char *} must either be 0 (null) or not-null - and '\0' (NUL byte) terminated; otherwise the results are - undefined. - - A TQCString that has not been assigned to anything is \e null, i.e. - both the length and the data pointer is 0. A TQCString that - references the empty string ("", a single '\0' char) is \e empty. - Both null and empty TQCStrings are legal parameters to the methods. - Assigning \c{const char *} 0 to TQCString produces a null TQCString. - - The length() function returns the length of the string; resize() - resizes the string and truncate() truncates the string. A string - can be filled with a character using fill(). Strings can be left - or right padded with characters using leftJustify() and - rightJustify(). Characters, strings and regular expressions can be - searched for using find() and findRev(), and counted using - contains(). - - Strings and characters can be inserted with insert() and appended - with append(). A string can be prepended with prepend(). - Characters can be removed from the string with remove() and - replaced with replace(). - - Portions of a string can be extracted using left(), right() and - mid(). Whitespace can be removed using stripWhiteSpace() and - simplifyWhiteSpace(). Strings can be converted to uppercase or - lowercase with upper() and lower() respectively. - - Strings that contain numbers can be converted to numbers with - toShort(), toInt(), toLong(), toULong(), toFloat() and toDouble(). - Numbers can be converted to strings with setNum(). - - Many operators are overloaded to work with TQCStrings. TQCString - also supports some more obscure functions, e.g. sprintf(), - setStr() and setExpand(). - - \target asciinotion - \sidebar Note on Character Comparisons - - In TQCString the notion of uppercase and lowercase and of which - character is greater than or less than another character is locale - dependent. This affects functions which support a case insensitive - option or which compare or lowercase or uppercase their arguments. - Case insensitive operations and comparisons will be accurate if - both strings contain only ASCII characters. (If \c $LC_CTYPE is - set, most Unix systems do "the right thing".) Functions that this - affects include contains(), find(), findRev(), \l operator<(), \l - operator<=(), \l operator>(), \l operator>=(), lower() and - upper(). - - This issue does not apply to \l{TQString}s since they represent - characters using Unicode. - \endsidebar - - Performance note: The TQCString methods for TQRegExp searching are - implemented by converting the TQCString to a TQString and performing - the search on that. This implies a deep copy of the TQCString data. - If you are going to perform many TQRegExp searches on a large - TQCString, you will get better performance by converting the - TQCString to a TQString yourself, and then searching in the TQString. -*/ - -/*! - \fn TQCString::TQCString() - - Constructs a null string. - - \sa isNull() -*/ - -/*! - \fn TQCString::TQCString( const TQCString &s ) - - Constructs a shallow copy \a s. - - \sa assign() -*/ - -/*! - Constructs a string with room for \a size characters, including - the '\0'-terminator. Makes a null string if \a size == 0. - - If \a size \> 0, then the first and last characters in the string - are initialized to '\0'. All other characters are uninitialized. - - \sa resize(), isNull() -*/ - -TQCString::TQCString( int size ) - : TQByteArray( size ) -{ - if ( size > 0 ) { - *data() = '\0'; // set terminator - *(data()+(size-1)) = '\0'; - } -} - -/*! - Constructs a string that is a deep copy of \a str. - - If \a str is 0 a null string is created. - - \sa isNull() -*/ - -TQCString::TQCString( const char *str ) -{ - duplicate( str, tqstrlen(str) + 1 ); -} - - -/*! - Constructs a string that is a deep copy of \a str. The copy will - be at most \a maxsize bytes long including the '\0'-terminator. - - Example: - \code - TQCString str( "helloworld", 6 ); // assigns "hello" to str - \endcode - - If \a str contains a 0 byte within the first \a maxsize bytes, the - resulting TQCString will be terminated by this 0. If \a str is 0 a - null string is created. - - \sa isNull() -*/ - -TQCString::TQCString( const char *str, uint maxsize ) -{ - if ( str == 0 ) - return; - uint len; // index of first '\0' - for ( len = 0; len < maxsize - 1; len++ ) { - if ( str[len] == '\0' ) - break; - } - TQByteArray::tqresize( len + 1 ); - memcpy( data(), str, len ); - data()[len] = 0; -} - -/*! - \reimp -*/ - -TQCString::~TQCString() -{ -} - -TQCString &TQCString::operator=(const QByteArray &ba) { - TQByteArray::operator=(ba); - return *this; -} - -/*! - \fn TQCString &TQCString::operator=( const TQCString &s ) - - Assigns a shallow copy of \a s to this string and returns a - reference to this string. -*/ - -/*! - \overload TQCString &TQCString::operator=( const char *str ) - - Assigns a deep copy of \a str to this string and returns a - reference to this string. - - If \a str is 0 a null string is created. - - \sa isNull() -*/ - -/*! - \fn bool TQCString::isNull() const - - Returns TRUE if the string is null, i.e. if data() == 0; otherwise - returns FALSE. A null string is also an empty string. - - Example: - \code - TQCString a; // a.data() == 0, a.size() == 0, a.length() == 0 - TQCString b == ""; // b.data() == "", b.size() == 1, b.length() == 0 - a.isNull(); // TRUE because a.data() == 0 - a.isEmpty(); // TRUE because a.length() == 0 - b.isNull(); // FALSE because b.data() == "" - b.isEmpty(); // TRUE because b.length() == 0 - \endcode - - \sa isEmpty(), length(), size() -*/ - -/*! - \fn bool TQCString::isEmpty() const - - Returns TRUE if the string is empty, i.e. if length() == 0; - otherwise returns FALSE. An empty string is not always a null - string. - - See example in isNull(). - - \sa isNull(), length(), size() -*/ - -/*! - \fn uint TQCString::length() const - - Returns the length of the string, excluding the '\0'-terminator. - Equivalent to calling \c strlen(data()). - - Null strings and empty strings have zero length. - - \sa size(), isNull(), isEmpty() -*/ - -/*! - \fn bool TQCString::truncate( uint pos ) - - Truncates the string at position \a pos. - - Equivalent to calling \c resize(pos+1). - - Example: - \code - TQCString s = "truncate this string"; - s.truncate( 5 ); // s == "trunc" - \endcode - - \sa resize() -*/ - -/*! - Extends or shrinks the string to \a len bytes, including the - '\0'-terminator. - - A '\0'-terminator is set at position \c{len - 1} unless - \c{len == 0}. - - Example: - \code - TQCString s = "resize this string"; - s.resize( 7 ); // s == "resize" - \endcode - - \sa truncate() -*/ - -bool TQCString::tqresize( uint len ) -{ - detach(); - uint wasNull = isNull(); - if ( !TQByteArray::tqresize(len) ) - return FALSE; - if ( len ) - data()[len - 1] = '\0'; - if ( len > 0 && wasNull ) - data()[0] = '\0'; - return TRUE; -} - - -/*! - Implemented as a call to the native vsprintf() (see the manual for - your C library). - - If the string is shorter than 256 characters, this sprintf() calls - resize(256) to decrease the chance of memory corruption. The - string is resized back to its actual length before sprintf() - returns. - - Example: - \code - TQCString s; - s.sprintf( "%d - %s", 1, "first" ); // result < 256 chars - - TQCString big( 25000 ); // very long string - big.sprintf( "%d - %s", 2, longString ); // result < 25000 chars - \endcode - - \warning All vsprintf() implementations will write past the end of - the target string (*this) if the \a format specification and - arguments happen to be longer than the target string, and some - will also fail if the target string is longer than some arbitrary - implementation limit. - - Giving user-supplied arguments to sprintf() is risky: Sooner or - later someone will paste a huge line into your application. -*/ - -TQCString &TQCString::sprintf( const char *format, ... ) -{ - detach(); - va_list ap; - va_start( ap, format ); - if ( size() < 256 ) - TQByteArray::tqresize( 256 ); // make string big enough -#ifdef TQT_VSNPRINTF - TQT_VSNPRINTF( data(), size(), format, ap ); -#else - vsprintf( data(), format, ap ); -#endif - resize( tqstrlen(data()) + 1 ); // truncate - va_end( ap ); - return *this; -} - - -/*! - Fills the string with \a len bytes of character \a c, followed by - a '\0'-terminator. - - If \a len is negative, then the current string length is used. - - Returns FALSE is \a len is nonnegative and there is not enough - memory to resize the string; otherwise returns TRUE. -*/ - -bool TQCString::fill( char c, int len ) -{ - detach(); - if ( len < 0 ) - len = length(); - if ( !TQByteArray::fill(c,len+1) ) - return FALSE; - *(data()+len) = '\0'; - return TRUE; -} - - -/*! - \fn TQCString TQCString::copy() const - - Returns a deep copy of this string. - - \sa detach() -*/ - - -/*! - Finds the first occurrence of the character \a c, starting at - position \a index. - - The search is case sensitive if \a cs is TRUE, or case insensitive - if \a cs is FALSE. - - Returns the position of \a c, or -1 if \a c could not be found. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -int TQCString::find( char c, int index, bool cs ) const -{ - if ( (uint)index >= size() ) // index outside string - return -1; - register const char *d; - if ( cs ) { // case sensitive - d = strchr( data()+index, c ); - } else { - d = data()+index; - c = tolower( (uchar) c ); - while ( *d && tolower((uchar) *d) != c ) - d++; - if ( !*d && c ) // not found - d = 0; - } - return d ? (int)(d - data()) : -1; -} - -#define REHASH( a ) \ - if ( sl_minus_1 < sizeof(uint) * CHAR_BIT ) \ - hashHaystack -= (a) << sl_minus_1; \ - hashHaystack <<= 1 - -/*! - \overload - - Finds the first occurrence of the string \a str, starting at - position \a index. - - The search is case sensitive if \a cs is TRUE, or case insensitive - if \a cs is FALSE. - - Returns the position of \a str, or -1 if \a str could not be - found. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -int TQCString::find( const char *str, int index, bool cs ) const -{ - return find( str, index, cs, length() ); -} - -int TQCString::find( const char *str, int index, bool cs, uint l ) const -{ - if ( (uint)index >= size() ) - return -1; - if ( !str ) - return -1; - if ( !*str ) - return index; - const uint sl = tqstrlen( str ); - if ( sl + index > l ) - return -1; - - if ( sl == 1 ) - return find( *str, index, cs ); - - /* - See TQString::find() for details. - */ - const char* needle = str; - const char* haystack = data() + index; - const char* end = data() + (l-sl); - const uint sl_minus_1 = sl-1; - uint hashNeedle = 0, hashHaystack = 0,i; - - if ( cs ) { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + needle[i] ); - hashHaystack = ((hashHaystack<<1) + haystack[i] ); - } - hashHaystack -= *(haystack+sl_minus_1); - - while ( haystack <= end ) { - hashHaystack += *(haystack+sl_minus_1); - if ( hashHaystack == hashNeedle && *needle == *haystack - && tqstrncmp( needle, haystack, sl ) == 0 ) - return haystack - data(); - - REHASH( *haystack ); - ++haystack; - } - } else { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + - tolower( needle[i] ) ); - hashHaystack = ((hashHaystack<<1) + - tolower( haystack[i] ) ); - } - hashHaystack -= tolower(*(haystack+sl_minus_1)); - - while ( haystack <= end ) { - hashHaystack += tolower(*(haystack+sl_minus_1)); - if ( hashHaystack == hashNeedle - && qstrnicmp( needle, haystack, sl ) == 0 ) - return haystack - data(); - - REHASH( tolower(*haystack) ); - ++haystack; - } - } - return -1; -} - - -/*! - Finds the first occurrence of the character \a c, starting at - position \a index and searching backwards. - - The search is case sensitive if \a cs is TRUE, or case insensitive - if \a cs is FALSE. - - Returns the position of \a c, or -1 if \a c could not be found. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -int TQCString::findRev( char c, int index, bool cs ) const -{ - register const char *b = data(); - register const char *d; - if ( index < 0 ) - index = length(); - if ( (uint)index >= size() ) - return -1; - d = b + index; - if ( cs ) { - while ( d >= b && *d != c ) - d--; - } else { - c = tolower( (uchar) c ); - while ( d >= b && tolower((uchar) *d) != c ) - d--; - } - return d >= b ? (int)(d - b) : -1; -} - -/*! - \overload - - Finds the first occurrence of the string \a str, starting at - position \a index and searching backwards. - - The search is case sensitive if \a cs is TRUE, or case insensitive - if \a cs is FALSE. - - Returns the position of \a str, or -1 if \a str could not be - found. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -int TQCString::findRev( const char *str, int index, bool cs ) const -{ - /* - See TQString::find() for explanations. - */ - const uint sl = tqstrlen( str ); - const uint l = length(); - int delta = l-sl; - if ( index < 0 ) - index = delta; - if ( index < 0 || index > (int)l ) - return -1; - if ( index > delta ) - index = delta; - - if ( sl == 1 ) - return findRev( *str, index, cs ); - - const char* needle = str; - const char* haystack = data() + index; - const char* end = data(); - const uint sl_minus_1 = sl-1; - const char* n = needle+sl_minus_1; - const char* h = haystack+sl_minus_1; - uint hashNeedle = 0, hashHaystack = 0, i; - - if ( cs ) { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + *(n-i) ); - hashHaystack = ((hashHaystack<<1) + *(h-i) ); - } - hashHaystack -= *haystack; - while ( haystack >= end ) { - hashHaystack += *haystack; - if ( hashHaystack == hashNeedle && tqstrncmp( needle, haystack, sl ) == 0 ) - return haystack-data(); - --haystack; - REHASH( *(haystack+sl) ); - } - } else { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + tolower( *(n-i) ) ); - hashHaystack = ((hashHaystack<<1) + tolower( *(h-i) ) ); - } - hashHaystack -= tolower(*haystack); - while ( haystack >= end ) { - hashHaystack += tolower(*haystack); - if ( hashHaystack == hashNeedle && qstrnicmp( needle, haystack, sl ) == 0 ) - return haystack-data(); - --haystack; - REHASH( tolower(*(haystack+sl)) ); - } - } - return -1; -} - - -/*! - Returns the number of times the character \a c occurs in the - string. - - The match is case sensitive if \a cs is TRUE, or case insensitive - if \a cs if FALSE. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -int TQCString::contains( char c, bool cs ) const -{ - int count = 0; - const char *d = data(); - if ( !d ) - return 0; - if ( cs ) { // case sensitive - while ( *d ) - if ( *d++ == c ) - count++; - } else { // case insensitive - c = tolower( (uchar) c ); - while ( *d ) { - if ( tolower((uchar) *d) == c ) - count++; - d++; - } - } - return count; -} - -/*! - \overload - - Returns the number of times \a str occurs in the string. - - The match is case sensitive if \a cs is TRUE, or case insensitive - if \a cs if FALSE. - - This function counts overlapping substrings, for example, "banana" - contains two occurrences of "ana". - - \sa findRev() - \link #asciinotion Note on character comparisons \endlink -*/ - -int TQCString::contains( const char *str, bool cs ) const -{ - int count = 0; - int i = -1; - uint l = length(); - // use find for the faster hashing algorithm - while ( ( i = find ( str, i+1, cs, l ) ) != -1 ) - count++; - return count; -} - -/*! - Returns a substring that contains the \a len leftmost characters - of the string. - - The whole string is returned if \a len exceeds the length of the - string. - - Example: - \code - TQCString s = "Pineapple"; - TQCString t = s.left( 4 ); // t == "Pine" - \endcode - - \sa right(), mid() -*/ -TQCString TQCString::left( uint len ) const -{ - if ( isEmpty() ) { - TQCString empty; - return empty; - } else if ( len >= size() ) { - TQCString same( data() ); - return same; - } else { - TQCString s( len+1 ); - strncpy( s.data(), data(), len ); - *(s.data()+len) = '\0'; - return s; - } -} - -/*! - Returns a substring that contains the \a len rightmost characters - of the string. - - The whole string is returned if \a len exceeds the length of the - string. - - Example: - \code - TQCString s = "Pineapple"; - TQCString t = s.right( 5 ); // t == "apple" - \endcode - - \sa left(), mid() -*/ - -TQCString TQCString::right( uint len ) const -{ - if ( isEmpty() ) { - TQCString empty; - return empty; - } else { - uint l = length(); - if ( len > l ) - len = l; - char *p = const_cast<char*>(data()) + (l - len); - return TQCString( p ); - } -} - -/*! - Returns a substring that contains at most \a len characters from - this string, starting at position \a index. - - Returns a null string if the string is empty or if \a index is out - of range. Returns the whole string from \a index if \a index+len - exceeds the length of the string. - - Example: - \code - TQCString s = "Two pineapples"; - TQCString t = s.mid( 4, 3 ); // t == "pin" - \endcode - - \sa left(), right() -*/ - -TQCString TQCString::mid( uint index, uint len ) const -{ - uint slen = tqstrlen( data() ); - if ( isEmpty() || index >= slen ) { - TQCString empty; - return empty; - } else { - if ( len > slen-index ) - len = slen - index; - register char *p = const_cast<char*>(data())+index; - TQCString s( len+1 ); - strncpy( s.data(), p, len ); - *(s.data()+len) = '\0'; - return s; - } -} - -/*! - Returns a string of length \a width (plus one for the terminating - '\0') that contains this string padded with the \a fill character. - - If the length of the string exceeds \a width and \a truncate is - FALSE (the default), then the returned string is a copy of the - string. If the length of the string exceeds \a width and \a - truncate is TRUE, then the returned string is a left(\a width). - - Example: - \code - TQCString s("apple"); - TQCString t = s.leftJustify(8, '.'); // t == "apple..." - \endcode - - \sa rightJustify() -*/ - -TQCString TQCString::leftJustify( uint width, char fill, bool truncate ) const -{ - TQCString result; - int len = tqstrlen(data()); - int padlen = width - len; - if ( padlen > 0 ) { - result.TQByteArray::tqresize( len+padlen+1 ); - memcpy( result.data(), data(), len ); - memset( result.data()+len, fill, padlen ); - result[len+padlen] = '\0'; - } else { - if ( truncate ) - result = left( width ); - else - result = copy(); - } - return result; -} - -/*! - Returns a string of length \a width (plus one for the terminating - '\0') that contains zero or more of the \a fill character followed - by this string. - - If the length of the string exceeds \a width and \a truncate is - FALSE (the default), then the returned string is a copy of the - string. If the length of the string exceeds \a width and \a - truncate is TRUE, then the returned string is a left(\a width). - - Example: - \code - TQCString s("pie"); - TQCString t = s.rightJustify(8, '.'); // t == ".....pie" - \endcode - - \sa leftJustify() -*/ - -TQCString TQCString::rightJustify( uint width, char fill, bool truncate ) const -{ - TQCString result; - int len = tqstrlen(data()); - int padlen = width - len; - if ( padlen > 0 ) { - result.TQByteArray::tqresize( len+padlen+1 ); - memset( result.data(), fill, padlen ); - memcpy( result.data()+padlen, data(), len ); - result[len+padlen] = '\0'; - } else { - if ( truncate ) - result = left( width ); - else - result = copy(); - } - return result; -} - -/*! - Returns a new string that is a copy of this string converted to lower - case. - - Example: - \code - TQCString s("Credit"); - TQCString t = s.lower(); // t == "credit" - \endcode - - \sa upper() - \link #asciinotion Note on character comparisons \endlink -*/ - -TQCString TQCString::lower() const -{ - TQCString s( data() ); - register char *p = s.data(); - if ( p ) { - while ( *p ) { - *p = tolower( (uchar) *p ); - p++; - } - } - return s; -} - -/*! - Returns a new string that is a copy of this string converted to upper case. - - Example: - \code - TQCString s( "Debit" ); - TQCString t = s.upper(); // t == "DEBIT" - \endcode - - \sa lower() - \link #asciinotion Note on character comparisons \endlink -*/ - -TQCString TQCString::upper() const -{ - TQCString s( data() ); - register char *p = s.data(); - if ( p ) { - while ( *p ) { - *p = toupper(*p); - p++; - } - } - return s; -} - - -/*! - Returns a new string that has white space removed from the start - and the end. - - White space means the decimal ASCII codes 9, 10, 11, 12, 13 and - 32. - - Example: - \code - TQCString s = " space "; - TQCString t = s.stripWhiteSpace(); // t == "space" - \endcode - - \sa simplifyWhiteSpace() -*/ - -TQCString TQCString::stripWhiteSpace() const -{ - if ( isEmpty() ) // nothing to do - return copy(); - - register char *s = const_cast<char*>(data()); - TQCString result = s; - int reslen = result.length(); - if ( !isspace((uchar) s[0]) && !isspace((uchar) s[reslen-1]) ) - return result; // returns a copy - - s = result.data(); - int start = 0; - int end = reslen - 1; - while ( isspace((uchar) s[start]) ) // skip white space from start - start++; - if ( s[start] == '\0' ) { // only white space - result.resize( 1 ); - return result; - } - while ( end && isspace((uchar) s[end]) ) // skip white space from end - end--; - end -= start - 1; - memmove( result.data(), &s[start], end ); - result.resize( end + 1 ); - return result; -} - - -/*! - Returns a new string that has white space removed from the start - and the end, plus any sequence of internal white space replaced - with a single space (ASCII 32). - - White space means the decimal ASCII codes 9, 10, 11, 12, 13 and - 32. - - \code - TQCString s = " lots\t of\nwhite space "; - TQCString t = s.simplifyWhiteSpace(); // t == "lots of white space" - \endcode - - \sa stripWhiteSpace() -*/ - -TQCString TQCString::simplifyWhiteSpace() const -{ - if ( isEmpty() ) // nothing to do - return copy(); - TQCString result( size() ); - char *from = const_cast<char*>(data()); - char *to = result.data(); - char *first = to; - for ( ;; ) { - while ( isspace((uchar) *from) ) - from++; - while ( *from && !isspace((uchar) *from) ) - *to++ = *from++; - if ( *from ) - *to++ = 0x20; // ' ' - else - break; - } - if ( to > first && *(to-1) == 0x20 ) - to--; - *to = '\0'; - result.resize( (int)(to - result.data()) + 1 ); - return result; -} - - -/*! - \overload - - Inserts string \a s into the string at position \a index. - - If \a index is beyond the end of the string, the string is - padded with spaces (ASCII 32) to length \a index and then \a s - is appended. - - \code - TQCString s = "I like fish"; - s.insert( 2, "don't "); // s == "I don't like fish" - - s = "x"; // index 01234 - s.insert( 3, "yz" ); // s == "x yz" - \endcode -*/ - -TQCString &TQCString::insert( uint index, const char *s ) -{ - int len = tqstrlen(s); - if ( len == 0 ) - return *this; - uint olen = length(); - int nlen = olen + len; - if ( index >= olen ) { // insert after end of string - detach(); - if ( TQByteArray::tqresize(nlen+index-olen+1 ) ) { - memset( data()+olen, ' ', index-olen ); - memcpy( data()+index, s, len+1 ); - } - } else { - detach(); - if ( TQByteArray::tqresize(nlen+1 ) ) { // normal insert - memmove( data()+index+len, data()+index, olen-index+1 ); - memcpy( data()+index, s, len ); - } - } - return *this; -} - -/*! - Inserts character \a c into the string at position \a index and - returns a reference to the string. - - If \a index is beyond the end of the string, the string is - padded with spaces (ASCII 32) to length \a index and then \a c - is appended. - - Example: - \code - TQCString s = "Yes"; - s.insert( 3, '!'); // s == "Yes!" - \endcode - - \sa remove(), replace() -*/ - -TQCString &TQCString::insert( uint index, char c ) // insert char -{ - char buf[2]; - buf[0] = c; - buf[1] = '\0'; - return insert( index, buf ); -} - -/*! - \fn TQCString &TQCString::prepend( const char *s ) - - Prepend \a s to the string. Equivalent to insert(0, s). - - \sa insert() -*/ - -/*! - Removes \a len characters from the string, starting at position \a - index, and returns a reference to the string. - - If \a index is out of range, nothing happens. If \a index is - valid, but \a index + \a len is larger than the length of the - string, the string is truncated at position \a index. - - \code - TQCString s = "Montreal"; - s.remove( 1, 4 ); // s == "Meal" - \endcode - - \sa insert(), replace() -*/ - -TQCString &TQCString::remove( uint index, uint len ) -{ - uint olen = length(); - if ( index + len >= olen ) { // range problems - if ( index < olen ) { // index ok - detach(); - resize( index+1 ); - } - } else if ( len != 0 ) { - detach(); - memmove( data()+index, data()+index+len, olen-index-len+1 ); - TQByteArray::tqresize(olen-len+1 ); - } - return *this; -} - -/*! - Replaces \a len characters from the string, starting at position - \a index, with \a str, and returns a reference to the string. - - If \a index is out of range, nothing is removed and \a str is - appended at the end of the string. If \a index is valid, but \a - index + \a len is larger than the length of the string, \a str - replaces the rest of the string from position \a index. - - \code - TQCString s = "Say yes!"; - s.replace( 4, 3, "NO" ); // s == "Say NO!" - \endcode - - \sa insert(), remove() -*/ - -TQCString &TQCString::replace( uint index, uint len, const char *str ) -{ - remove( index, len ); - insert( index, str ); - return *this; -} - - -/*! \overload - - Replaces every occurrence of the character \a c in the string - with \a after. Returns a reference to the string. - - Example: - \code - TQCString s = "a,b,c"; - s.replace( ',', " or " ); - // s == "a or b or c" - \endcode -*/ -TQCString &TQCString::replace( char c, const char *after ) -{ - char str[2]; - str[0] = c; - str[1] = '\0'; - return replace( str, after ); -} - -/*! \overload - - Replaces every occurrence of the string \a before in the string - with the string \a after. Returns a reference to the string. - - Example: - \code - TQCString s = "Greek is Greek"; - s.replace( "Greek", "English" ); - // s == "English is English" - \endcode -*/ - -TQCString &TQCString::replace( const char *before, const char *after ) -{ - if ( before == after || isNull() ) - return *this; - - detach(); - - int index = 0; - const int bl = before ? int(strlen( before )) : 0; - const int al = after ? int(strlen( after )) : 0; - char *d = data(); - uint len = length(); - - if ( bl == al ) { - if ( bl ) { - while( (index = find( before, index, TRUE, len ) ) != -1 ) { - memcpy( d+index, after, al ); - index += bl; - } - } - } else if ( al < bl ) { - uint to = 0; - uint movestart = 0; - uint num = 0; - while( (index = find( before, index, TRUE, len ) ) != -1 ) { - if ( num ) { - int msize = index - movestart; - if ( msize > 0 ) { - memmove( d + to, d + movestart, msize ); - to += msize; - } - } else { - to = index; - } - if ( al ) { - memcpy( d + to, after, al ); - to += al; - } - index += bl; - movestart = index; - num++; - } - if ( num ) { - int msize = len - movestart; - if ( msize > 0 ) - memmove( d + to, d + movestart, msize ); - resize( len - num*(bl-al) + 1 ); - } - } else { - // the most complex case. We don't want to loose performance by doing repeated - // copies and reallocs of the string. - while( index != -1 ) { - uint indices[4096]; - uint pos = 0; - while( pos < 4095 ) { - index = find(before, index, TRUE, len); - if ( index == -1 ) - break; - indices[pos++] = index; - index += bl; - // avoid infinite loop - if ( !bl ) - index++; - } - if ( !pos ) - break; - - // we have a table of replacement positions, use them for fast replacing - int adjust = pos*(al-bl); - // index has to be adjusted in case we get back into the loop above. - if ( index != -1 ) - index += adjust; - uint newlen = len + adjust; - int moveend = len; - if ( newlen > len ) { - resize( newlen + 1 ); - len = newlen; - } - d = data(); - - while( pos ) { - pos--; - int movestart = indices[pos] + bl; - int insertstart = indices[pos] + pos*(al-bl); - int moveto = insertstart + al; - memmove( d + moveto, d + movestart, (moveend - movestart) ); - if ( after ) - memcpy( d + insertstart, after, al ); - moveend = movestart - bl; - } - } - } - return *this; -} - -/*! \overload - - Replaces every occurrence of \a c1 with the char \a c2. - Returns a reference to the string. -*/ -TQCString &TQCString::replace( char c1, char c2 ) -{ - detach(); - uint i = 0; - char *d = data(); - uint len = length(); - while ( i < len ) { - if ( d[i] == c1 ) - d[i] = c2; - i++; - } - return *this; -} - - -#ifndef TQT_NO_REGEXP_CAPTURE -/*! - \overload - - Finds the first occurrence of the regular expression \a rx, - starting at position \a index. - - Returns the position of the next match, or -1 if \a rx was not - found. - - \warning If you want to apply this function repeatedly to the same - string it is more efficient to convert the string to a TQString and - apply the function to that. -*/ - -int TQCString::find( const TQRegExp& rx, int index ) const -{ - TQString d = TQString::fromAscii( data() ); - return d.find( rx, index ); -} - -/*! - \overload - - Finds the first occurrence of the regular expression \a rx, - starting at position \a index and searching backwards. - - Returns the position of the next match (backwards), or -1 if \a rx - was not found. - - \warning If you want to apply this function repeatedly to the same - string it is more efficient to convert the string to a TQString and - apply the function to that. -*/ - -int TQCString::findRev( const TQRegExp& rx, int index ) const -{ - TQString d = TQString::fromAscii( data() ); - return d.findRev( rx, index ); -} - -/*! - \overload - - Counts the number of overlapping occurrences of \a rx in the string. - - Example: - \code - TQString s = "banana and panama"; - TQRegExp r = TQRegExp( "a[nm]a", TRUE, FALSE ); - s.contains( r ); // 4 matches - \endcode - - \sa find(), findRev() - - \warning If you want to apply this function repeatedly to the same - string it is more efficient to convert the string to a TQString and - apply the function to that. -*/ - -int TQCString::contains( const TQRegExp &rx ) const -{ - TQString d = TQString::fromAscii( data() ); - return d.contains( rx ); -} - - -/*! - \overload - - Replaces every occurrence of \a rx in the string with \a str. - Returns a reference to the string. - - Example: - \code - TQString s = "banana"; - s.replace( TQRegExp("a.*a"), "" ); // becomes "b" - - s = "banana"; - s.replace( TQRegExp("^[bn]a"), "X" ); // becomes "Xnana" - - s = "banana"; - s.replace( TQRegExp("^[bn]a"), "" ); // becomes "nana" - \endcode - - \warning If you want to apply this function repeatedly to the same - string it is more efficient to convert the string to a TQString and - apply the function to that. -*/ - -TQCString &TQCString::replace( const TQRegExp &rx, const char *str ) -{ - TQString d = TQString::fromAscii( data() ); - TQString r = TQString::fromAscii( str ); - d.replace( rx, r ); - setStr( d.ascii() ); - return *this; -} -#endif //TQT_NO_REGEXP - -/*! - Returns the string converted to a \c long value. - - If \a ok is not 0: \a *ok is set to FALSE if the string is not a - number, or if it has trailing garbage; otherwise \a *ok is set to - TRUE. -*/ - -long TQCString::toLong( bool *ok ) const -{ - char *p = const_cast<char*>(data()); - long val=0; - const long max_mult = LONG_MAX / 10; - bool is_ok = FALSE; - int neg = 0; - if ( !p ) - goto bye; - while ( isspace((uchar) *p) ) // skip leading space - p++; - if ( *p == '-' ) { - p++; - neg = 1; - } else if ( *p == '+' ) { - p++; - } - if ( !isdigit((uchar) *p) ) - goto bye; - while ( isdigit((uchar) *p) ) { - if ( val > max_mult || (val == max_mult && (*p-'0') > 7+neg) ) - goto bye; - val = 10*val + (*p++ - '0'); - } - if ( neg ) - val = -val; - while ( isspace((uchar) *p) ) // skip trailing space - p++; - if ( *p == '\0' ) - is_ok = TRUE; -bye: - if ( ok ) - *ok = is_ok; - return is_ok ? val : 0; -} - -/*! - Returns the string converted to an \c{unsigned long} value. - - If \a ok is not 0: \a *ok is set to FALSE if the string is not a - number, or if it has trailing garbage; otherwise \a *ok is set to - TRUE. -*/ - -ulong TQCString::toULong( bool *ok ) const -{ - char *p = const_cast<char*>(data()); - ulong val=0; - const ulong max_mult = ULONG_MAX / 10; - bool is_ok = FALSE; - if ( !p ) - goto bye; - while ( isspace((uchar) *p) ) // skip leading space - p++; - if ( *p == '+' ) - p++; - if ( !isdigit((uchar) *p) ) - goto bye; - while ( isdigit((uchar) *p) ) { - if ( val > max_mult || (val == max_mult && (*p-'0') > 5) ) - goto bye; - val = 10*val + (*p++ - '0'); - } - while ( isspace((uchar) *p) ) // skip trailing space - p++; - if ( *p == '\0' ) - is_ok = TRUE; -bye: - if ( ok ) - *ok = is_ok; - return is_ok ? val : 0; -} - -/*! - Returns the string converted to a \c{short} value. - - If \a ok is not 0: \a *ok is set to FALSE if the string is not a - number, is out of range, or if it has trailing garbage; otherwise - \a *ok is set to TRUE. -*/ - -short TQCString::toShort( bool *ok ) const -{ - long v = toLong( ok ); - if ( v < SHRT_MIN || v > SHRT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (short)v; -} - -/*! - Returns the string converted to an \c{unsigned short} value. - - If \a ok is not 0: \a *ok is set to FALSE if the string is not a - number, is out of range, or if it has trailing garbage; otherwise - \a *ok is set to TRUE. -*/ - -ushort TQCString::toUShort( bool *ok ) const -{ - ulong v = toULong( ok ); - if ( v > USHRT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (ushort)v; -} - - -/*! - Returns the string converted to a \c{int} value. - - If \a ok is not 0: \a *ok is set to FALSE if the string is not a - number, or if it has trailing garbage; otherwise \a *ok is set to - TRUE. -*/ - -int TQCString::toInt( bool *ok ) const -{ - long v = toLong( ok ); - if ( v < INT_MIN || v > INT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (int)v; -} - -/*! - Returns the string converted to an \c{unsigned int} value. - - If \a ok is not 0: \a *ok is set to FALSE if the string is not a - number, or if it has trailing garbage; otherwise \a *ok is set to - TRUE. -*/ - -uint TQCString::toUInt( bool *ok ) const -{ - ulong v = toULong( ok ); - if ( v > UINT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (uint)v; -} - -/*! - Returns the string converted to a \c{double} value. - - If \a ok is not 0: \a *ok is set to FALSE if the string is not a - number, or if it has trailing garbage; otherwise \a *ok is set to - TRUE. -*/ - -double TQCString::toDouble( bool *ok ) const -{ - char *end; - double val = strtod( data() ? data() : "", &end ); - if ( ok ) - *ok = ( data() && *data() && ( end == 0 || *end == '\0' ) ); - return val; -} - -/*! - Returns the string converted to a \c{float} value. - - If \a ok is not 0: \a *ok is set to FALSE if the string is not a - number, or if it has trailing garbage; otherwise \a *ok is set to - TRUE. -*/ - -float TQCString::toFloat( bool *ok ) const -{ - return (float)toDouble( ok ); -} - - -/*! - Makes a deep copy of \a str. Returns a reference to the string. -*/ - -TQCString &TQCString::setStr( const char *str ) -{ - detach(); - if ( str ) { // valid string -// store( str, tqstrlen(str)+1 ); - int slen = tqstrlen(str)+1; - resize(slen); - memcpy(QByteArray::data(), str, slen); - } - else // empty - resize( 0 ); - return *this; -} - -/*! - \overload - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -TQCString &TQCString::setNum( long n ) -{ - detach(); - char buf[20]; - register char *p = &buf[19]; - bool neg; - if ( n < 0 ) { - neg = TRUE; - n = -n; - } else { - neg = FALSE; - } - *p = '\0'; - do { - *--p = ((int)(n%10)) + '0'; - n /= 10; - } while ( n ); - if ( neg ) - *--p = '-'; -// store( p, tqstrlen(p)+1 ); - int slen = tqstrlen(p)+1; - resize(slen); - memcpy(QByteArray::data(), p, slen); - return *this; -} - -/*! - \overload - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -TQCString &TQCString::setNum( ulong n ) -{ - detach(); - char buf[20]; - register char *p = &buf[19]; - *p = '\0'; - do { - *--p = ((int)(n%10)) + '0'; - n /= 10; - } while ( n ); -// store( p, tqstrlen(p)+1 ); - int slen = tqstrlen(p)+1; - resize(slen); - memcpy(QByteArray::data(), p, slen); - return *this; -} - -/*! - \overload TQCString &TQCString::setNum( int n ) - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -/*! - \overload TQCString &TQCString::setNum( uint n ) - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -/*! - \overload TQCString &TQCString::setNum( short n ) - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -/*! - \overload TQCString &TQCString::setNum( ushort n ) - - Sets the string to the string representation of the number \a n - and returns a reference to the string. -*/ - -/*! - Sets the string to the string representation of the number \a n - and returns a reference to the string. - - The format of the string representation is specified by the format - character \a f, and the precision (number of digits after the - decimal point) is specified with \a prec. - - The valid formats for \a f are 'e', 'E', 'f', 'g' and 'G'. The - formats are the same as for sprintf(); they are explained in \l - TQString::arg(). -*/ - -TQCString &TQCString::setNum( double n, char f, int prec ) -{ -#if defined(TQT_CHECK_RANGE) - if ( !(f=='f' || f=='F' || f=='e' || f=='E' || f=='g' || f=='G') ) - qWarning( "TQCString::setNum: Invalid format char '%c'", f ); -#endif - char format[20]; - register char *fs = format; // generate format string - *fs++ = '%'; // "%.<prec>l<f>" - if ( prec > 99 ) - prec = 99; - *fs++ = '.'; - if ( prec >= 10 ) { - *fs++ = prec / 10 + '0'; - *fs++ = prec % 10 + '0'; - } else { - *fs++ = prec + '0'; - } - *fs++ = 'l'; - *fs++ = f; - *fs = '\0'; - return sprintf( format, n ); -} - -/*! \overload TQCString &TQCString::setNum( float n, char f, int prec ) */ - - -/*! - Sets the character at position \a index to \a c and expands the - string if necessary, padding with spaces. - - Returns FALSE if \a index was out of range and the string could - not be expanded; otherwise returns TRUE. -*/ - -bool TQCString::setExpand( uint index, char c ) -{ - detach(); - uint oldlen = length(); - if ( index >= oldlen ) { - if ( !TQByteArray::tqresize( index+2 ) ) // no memory - return FALSE; - if ( index > oldlen ) - memset( data() + oldlen, ' ', index - oldlen ); - *(data() + index+1) = '\0'; // terminate padded string - } - *(data() + index) = c; - return TRUE; -} - - -/*! - \fn TQCString::operator const char *() const - - Returns the string data. -*/ - - -/*! - \fn TQCString& TQCString::append( const char *str ) - - Appends string \a str to the string and returns a reference to the - string. Equivalent to operator+=(). -*/ - -/*! - Appends string \a str to the string and returns a reference to the string. -*/ - -TQCString& TQCString::operator+=( const char *str ) -{ - if ( !str ) - return *this; // nothing to append - detach(); - uint len1 = length(); - uint len2 = tqstrlen(str); - if ( !TQByteArray::tqresize( len1 + len2 + 1 ) ) - return *this; // no memory - memcpy( data() + len1, str, len2 + 1 ); - return *this; -} - -/*! - \overload - - Appends character \a c to the string and returns a reference to the string. -*/ - -TQCString &TQCString::operator+=( char c ) -{ - detach(); - uint len = length(); - if ( !TQByteArray::tqresize( len + 2 ) ) - return *this; // no memory - *(data() + len) = c; - *(data() + len+1) = '\0'; - return *this; -} - -TQCString& TQCString::operator+=( const QString qs ) -{ - uint len2 = tqstrlen(QByteArray::constData()); - TQByteArray::tqresize(len2); // Get rid of the old null terminator - QByteArray tmp = qs.toAscii(); - return append(tmp); -} - -TQCString& TQCString::operator+=( const QByteArray qba ) -{ - uint len2 = tqstrlen(QByteArray::constData()); - TQByteArray::tqresize(len2); // Get rid of the old null terminator - return append(qba); -} - -TQCString& TQCString::operator+=( const TQCString tqcs ) { - return operator+=(tqcs.constData()); -} - - -/***************************************************************************** - TQCString stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -/*! - \relates TQCString - - Writes string \a str to the stream \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ -TQDataStream &operator<<( TQDataStream &s, const TQCString &str ) -{ - return static_cast<TQDataStream&>(s.writeBytes( str.data(), str.size() )); -} - -/*! - \relates TQCString - - Reads a string into \a str from the stream \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator>>( TQDataStream &s, TQCString &str ) -{ - str.detach(); - TQ_UINT32 len; - s >> len; // read size of string - if ( len == 0 || s.eof() ) { // end of file reached - str.resize( 0 ); - return s; - } - if ( !str.TQByteArray::tqresize( (uint)len )) {// resize string -#if defined(TQT_CHECK_NULL) - qWarning( "TQDataStream: Not enough memory to read TQCString" ); -#endif - len = 0; - } - if ( len > 0 ) // not null array - s.readRawBytes( str.data(), (uint)len ); - return s; -} -#endif //TQT_NO_DATASTREAM - -/***************************************************************************** - Documentation for related functions - *****************************************************************************/ - -/*! - \fn bool operator==( const TQCString &s1, const TQCString &s2 ) - - \relates TQCString - - Returns TRUE if \a s1 and \a s2 are equal; otherwise returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) == 0. -*/ - -/*! - \overload bool operator==( const TQCString &s1, const char *s2 ) - - \relates TQCString - - Returns TRUE if \a s1 and \a s2 are equal; otherwise returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) == 0. -*/ - -/*! - \overload bool operator==( const char *s1, const TQCString &s2 ) - - \relates TQCString - - Returns TRUE if \a s1 and \a s2 are equal; otherwise returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) == 0. -*/ - -/*! - \fn bool operator!=( const TQCString &s1, const TQCString &s2 ) - - \relates TQCString - - Returns TRUE if \a s1 and \a s2 are different; otherwise returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) != 0. -*/ - -/*! - \overload bool operator!=( const TQCString &s1, const char *s2 ) - - \relates TQCString - - Returns TRUE if \a s1 and \a s2 are different; otherwise returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) != 0. -*/ - -/*! - \overload bool operator!=( const char *s1, const TQCString &s2 ) - - \relates TQCString - - Returns TRUE if \a s1 and \a s2 are different; otherwise returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) != 0. -*/ - -/*! - \fn bool operator<( const TQCString &s1, const char *s2 ) - - \relates TQCString - - Returns TRUE if \a s1 is less than \a s2; otherwise returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) \< 0. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -/*! - \overload bool operator<( const char *s1, const TQCString &s2 ) - - \relates TQCString - - Returns TRUE if \a s1 is less than \a s2; otherwise returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) \< 0. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -/*! - \fn bool operator<=( const TQCString &s1, const char *s2 ) - - \relates TQCString - - Returns TRUE if \a s1 is less than or equal to \a s2; otherwise - returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) \<= 0. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -/*! - \overload bool operator<=( const char *s1, const TQCString &s2 ) - - \relates TQCString - - Returns TRUE if \a s1 is less than or equal to \a s2; otherwise - returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) \<= 0. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -/*! - \fn bool operator>( const TQCString &s1, const char *s2 ) - - \relates TQCString - - Returns TRUE if \a s1 is greater than \a s2; otherwise returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) \> 0. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -/*! - \overload bool operator>( const char *s1, const TQCString &s2 ) - - \relates TQCString - - Returns TRUE if \a s1 is greater than \a s2; otherwise returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) \> 0. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -/*! - \fn bool operator>=( const TQCString &s1, const char *s2 ) - - \relates TQCString - - Returns TRUE if \a s1 is greater than or equal to \a s2; otherwise - returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) \>= 0. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -/*! - \overload bool operator>=( const char *s1, const TQCString &s2 ) - - \relates TQCString - - Returns TRUE if \a s1 is greater than or equal to \a s2; otherwise - returns FALSE. - - Equivalent to qstrcmp(\a s1, \a s2) \>= 0. - - \sa \link #asciinotion Note on character comparisons \endlink -*/ - -/*! - \fn const TQCString operator+( const TQCString &s1, const TQCString &s2 ) - - \relates TQCString - - Returns a string which consists of the concatenation of \a s1 and - \a s2. -*/ - -/*! - \overload const TQCString operator+( const TQCString &s1, const char *s2 ) - - \relates TQCString - - Returns a string which consists of the concatenation of \a s1 and \a s2. -*/ - -/*! - \overload const TQCString operator+( const char *s1, const TQCString &s2 ) - - \relates TQCString - - Returns a string which consists of the concatenation of \a s1 and \a s2. -*/ - -/*! - \overload const TQCString operator+( const TQCString &s, char c ) - - \relates TQCString - - Returns a string which consists of the concatenation of \a s and \a c. -*/ - -/*! - \overload const TQCString operator+( char c, const TQCString &s ) - - \relates TQCString - - Returns a string which consists of the concatenation of \a c and \a s. -*/ - -#endif // USE_QT4
\ No newline at end of file diff --git a/tqtinterface/qt4/src/tools/tqcstring.h b/tqtinterface/qt4/src/tools/tqcstring.h deleted file mode 100644 index 2b6a28d..0000000 --- a/tqtinterface/qt4/src/tools/tqcstring.h +++ /dev/null @@ -1,792 +0,0 @@ -/**************************************************************************** -** -** Definition of the extended char array operations, -** and TQByteArray and TQCString classes -** -** Created : 920609 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQCSTRING_H -#define TQCSTRING_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqmemarray.h" -#endif // TQT_H - -#include <string.h> - -#ifdef USE_QT4 - -#include <Qt/qbytearray.h> -#include <Qt/qregexp.h> -#include <Qt/qstring.h> - -#endif // USE_QT4 - -/***************************************************************************** - Safe and portable C string functions; extensions to standard string.h - *****************************************************************************/ - -TQ_EXPORT void *tqmemmove( void *dst, const void *src, uint len ); - -TQ_EXPORT char *tqstrdup( const char * ); - -TQ_EXPORT inline uint tqstrlen( const char *str ) -{ return str ? (uint)strlen(str) : 0u; } - -TQ_EXPORT inline char *tqstrcpy( char *dst, const char *src ) -{ return src ? strcpy(dst, src) : 0; } - -TQ_EXPORT char *tqstrncpy( char *dst, const char *src, uint len ); - -TQ_EXPORT inline int tqstrcmp( const char *str1, const char *str2 ) -{ - return ( str1 && str2 ) ? strcmp( str1, str2 ) - : ( str1 ? 1 : ( str2 ? -1 : 0 ) ); -} - -TQ_EXPORT inline int tqstrncmp( const char *str1, const char *str2, uint len ) -{ - return ( str1 && str2 ) ? strncmp( str1, str2, len ) - : ( str1 ? 1 : ( str2 ? -1 : 0 ) ); -} - -TQ_EXPORT int tqstricmp( const char *, const char * ); - -TQ_EXPORT int tqstrnicmp( const char *, const char *, uint len ); - -#ifndef TQT_CLEAN_NAMESPACE -TQ_EXPORT inline uint cstrlen( const char *str ) -{ return (uint)strlen(str); } - -TQ_EXPORT inline char *cstrcpy( char *dst, const char *src ) -{ return strcpy(dst,src); } - -TQ_EXPORT inline int cstrcmp( const char *str1, const char *str2 ) -{ return strcmp(str1,str2); } - -TQ_EXPORT inline int cstrncmp( const char *str1, const char *str2, uint len ) -{ return strncmp(str1,str2,len); } -#endif - - -// qChecksum: Internet checksum - -TQ_EXPORT TQ_UINT16 qChecksum( const char *s, uint len ); - -/***************************************************************************** - TQByteArray class - *****************************************************************************/ - -#ifdef USE_QT4 - -// NOTE: Qt4 uses implicit sharing -// Qt3 used explicit sharing - -class TQ_EXPORT TQByteArray : public QByteArray -{ -public: - TQByteArray() : QByteArray() {} - TQByteArray( int size ) : QByteArray( size, '\0' ) {} - ~TQByteArray(); - - TQByteArray(const char *cs) : QByteArray( cs ) {} - TQByteArray(const char *cs, int size) : QByteArray( cs, size ) {} - TQByteArray(int size, char c) : QByteArray( size, c ) {} - TQByteArray(int size, Qt::Initialization init ) : QByteArray( size, init ) {} - TQByteArray(const TQByteArray &ba ) : QByteArray( ba/*.data(), ba.size()*/ ) {} - TQByteArray(const QByteArray &ba ) : QByteArray( ba/*.data(), ba.size()*/ ) {} - - inline char *data() { if (isNull()) return 0; return QByteArray::data(); } - inline const char *data() const { if (isNull()) return 0; return QByteArray::data(); } - inline const char *constData() const { if (isNull()) return 0; return QByteArray::constData(); } - - inline TQByteArray& assign( const TQByteArray& a ) { *this->operator=(a); return *this; } - inline TQByteArray& assign( const char *a, uint n ) { clear(); resize(n); insert(0, a, n); return *this; } - inline TQByteArray& duplicate(const TQByteArray& a) { *this = a; return *this; } - inline TQByteArray& duplicate(const char *a, uint n) { *this = TQByteArray(a, n); return *this; } - inline bool fill( char ch, int size = -1 ) { QByteArray::fill(ch, size); return TRUE; } - inline void resetRawData(const char *, uint) { clear(); } - inline QByteArray& setRawData(const char *a, uint n) { *this = fromRawData(a, n); return *this; } // Yes, I know about the built-in Qt4 version of this function. It is potentially unstable (corrupts memory) as of Qt4.7 and should not yet be used. Reevaluate this at Qt4.8 or above. [FIXME] - inline QByteArray lower() const { return toLower(); } - inline QByteArray upper() const { return toUpper(); } - inline QByteArray stripWhiteSpace() const { return trimmed(); } - inline QByteArray simplifyWhiteSpace() const { return simplified(); } - inline int find(int c, int from = 0) const { return indexOf(c, from); } - inline int find(char c, int from = 0) const { return indexOf(c, from); } - inline int find(const char *c, int from = 0) const { return indexOf(c, from); } - inline int find(const QByteArray &ba, int from = 0) const { return indexOf(ba, from); } - inline int findRev(char c, int from = -1) const { return lastIndexOf(c, from); } - inline int findRev(const char *c, int from = -1) const { return lastIndexOf(c, from); } - inline int findRev(const QByteArray &ba, int from = -1) const { return lastIndexOf(ba, from); } -#ifndef QT_NO_CAST_TO_ASCII - inline int find(const QString &s, int from = 0) const; - inline int findRev(const QString &s, int from = -1) const; -#endif - inline TQByteArray copy() const { return TQByteArray(*this); } - inline QByteRef tqat( int i ) { -// #ifdef TQT_CHECK_RANGE - if ( (i >= size()) || (i < 0) ) { - qWarning( "TQByteArray::tqat: Absolute index %d out of range", i ); - i = 0; - } -// #endif - return QByteArray::operator[](i); - } - inline bool tqresize( uint newlen ) { resize(newlen); return true; } - inline bool tqresize( uint newlen, TQGArray::Optimization ) { resize(newlen); return true; } - - inline char &operator[]( int i ) { -// #ifdef TQT_CHECK_RANGE - if ( (i >= size()) || (i < 0) ) { - qWarning( "TQByteArray::operator[]: Absolute index %d out of range", i ); - i = 0; - } -// #endif - return *(this->data()+i); - } - - using QByteArray::operator=; - - // Interoperability -// static const TQByteArray& convertFromQByteArray( QByteArray& qba ); - static const TQByteArray convertFromQByteArray( QByteArray& qba ); -}; - -// Interoperability -// inline static const TQByteArray& convertFromQByteArray( const QByteArray& qba ) { -// return (*static_cast<const TQByteArray*>(&qba)); -// } -inline static const TQByteArray convertFromQByteArray( const QByteArray& qba ) { - return TQByteArray(qba); -} - -#ifndef TQT_NO_COMPRESS -TQ_EXPORT TQByteArray tqCompress( const uchar* data, int nbytes ); -TQ_EXPORT TQByteArray tqUncompress( const uchar* data, int nbytes ); -TQ_EXPORT inline TQByteArray tqCompress( const TQByteArray& data) -{ return tqCompress( (const uchar*)data.data(), data.size() ); } -TQ_EXPORT inline TQByteArray tqUncompress( const TQByteArray& data ) -{ return tqUncompress( (const uchar*)data.data(), data.size() ); } -#endif - -/***************************************************************************** - TQByteArray stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator<<( TQDataStream &tqds, const TQByteArray &tqba ); -TQ_EXPORT TQDataStream &operator>>( TQDataStream &tqds, TQByteArray &tqba ); -#endif - -#else // USE_QT4 - -#if defined(TQ_TQDOC) -/* - We want qdoc to document TQByteArray as a real class that inherits - TQMemArray<char> and that is inherited by TQBitArray. -*/ -class TQByteArray : public TQMemArray<char> -{ -public: - TQByteArray(); - TQByteArray( int size ); -}; -#else -typedef TQMemArray<char> TQByteArray; -#endif - -#ifndef TQT_NO_COMPRESS -TQ_EXPORT TQByteArray tqCompress( const uchar* data, int nbytes ); -TQ_EXPORT TQByteArray tqUncompress( const uchar* data, int nbytes ); -TQ_EXPORT inline TQByteArray tqCompress( const TQByteArray& data) -{ return tqCompress( (const uchar*)data.data(), data.size() ); } -TQ_EXPORT inline TQByteArray tqUncompress( const TQByteArray& data ) -{ return tqUncompress( (const uchar*)data.data(), data.size() ); } -#endif - -/***************************************************************************** - TQByteArray stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQByteArray & ); -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQByteArray & ); -#endif - -#endif // USE_QT4 - -/***************************************************************************** - TQCString class - *****************************************************************************/ - -// #ifdef USE_QT4 -#if 0 - -#include <QtCore/qbytearray.h> -#include <QtCore/qdatastream.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Qt3SupportLight) - -/***************************************************************************** - QCString class - *****************************************************************************/ - -class QRegExp; - -class TQCString : public TQByteArray -{ -public: - TQCString() : TQByteArray() {} - TQCString(int size); - TQCString(const TQCString &s) : TQByteArray(s) {} - TQCString(const QByteArray &ba) : TQByteArray(ba.constData()) {} - TQCString(const char *str); - TQCString(const char *str, uint maxlen); - - ~TQCString(); - - TQCString &operator=(const TQCString &s); - TQCString &operator=(const char *str); - TQCString &operator=(const QByteArray &ba); - - TQCString copy() const { return *this; } - TQCString &sprintf(const char *format, ...); - - TQCString left(uint len) const { return QByteArray::left(len); } - TQCString right(uint len) const { return QByteArray::right(len); } - TQCString mid(uint index, uint len=0xffffffff) const { return QByteArray::mid(index, len); } - - TQCString leftJustify(uint width, char fill=' ', bool trunc=false)const; - TQCString rightJustify(uint width, char fill=' ',bool trunc=false)const; - - TQCString lower() const { return QByteArray::toLower(); } - TQCString upper() const { return QByteArray::toUpper(); } - - TQCString stripWhiteSpace() const { return QByteArray::trimmed(); } - TQCString simplifyWhiteSpace() const { return QByteArray::simplified(); } - - uint length() const; - bool truncate( uint pos ); - - TQCString &insert(uint index, const char *c) { QByteArray::insert(index, c); return *this; } - TQCString &insert(uint index, char c) { QByteArray::insert(index, c); return *this; } - TQCString &append(const char *c) { QByteArray::append(c); return *this; } - TQCString &prepend(const char *c) { QByteArray::prepend(c); return *this; } - TQCString &remove(uint index, uint len) { QByteArray::remove(index, len); return *this; } - TQCString &replace(uint index, uint len, const char *c) - { TQByteArray::replace(index, len, c); return *this; } - TQCString &replace(char c, const TQCString &after) { return TQByteArray::replace(c, after.constData()); } - TQCString &replace(char c, const char *after) { QByteArray::replace(c, after); return *this; } - TQCString &replace(const TQCString &b, const TQCString &a) - { return TQByteArray::replace(b.constData(), a.constData()); } - TQCString &replace(const char *b, const char *a) { QByteArray::replace(b, a); return *this; } - TQCString &replace(char b, char a) { QByteArray::replace(b, a); return *this; } - - short toShort(bool *ok=0) const; - ushort toUShort(bool *ok=0) const; - int toInt(bool *ok=0) const; - uint toUInt(bool *ok=0) const; - long toLong(bool *ok=0) const; - ulong toULong(bool *ok=0) const; - float toFloat(bool *ok=0) const; - double toDouble(bool *ok=0) const; - - TQCString &setStr(const char *s) { *this = s; return *this; } - TQCString &setNum(short); - TQCString &setNum(ushort); - TQCString &setNum(int); - TQCString &setNum(uint); - TQCString &setNum(long); - TQCString &setNum(ulong); - TQCString &setNum(float, char f='g', int prec=6); - TQCString &setNum(double, char f='g', int prec=6); - - bool setExpand(uint index, char c); - - int contains( char c, bool cs=TRUE ) const; - int contains( const char *str, bool cs=TRUE ) const; -#ifndef TQT_NO_REGEXP - int contains( const QRegExp & ) const; -#endif - - int find( char c, int index=0, bool cs=TRUE ) const; - int find( const char *str, int index=0, bool cs=TRUE ) const; -#ifndef TQT_NO_REGEXP - int find( const QRegExp &re, int index=0 ) const; -#endif - -#ifndef TQT_NO_REGEXP - TQCString &replace( const QRegExp &, const char * ); -#endif - -// inline const char * tqstringFromPos( int index ) { const char & ref = (*this)[index]; return &ref; } - inline const char * tqstringFromPos( int index ) { return constData() + index; } - - operator const char *() const; - - TQCString &operator+=( const char *str ); - TQCString &operator+=( char c ); - TQCString &operator+=( const QString qs ); - TQCString &operator+=( const QByteArray qba ); - TQCString &operator+=( const TQCString tqcs ); - -private: - int find( const char *str, int index, bool cs, uint l ) const; -}; - -inline TQCString::operator const char *() const -{ return (const char *)data(); } - -/***************************************************************************** - TQCString stream functions - *****************************************************************************/ -#ifndef QT_NO_DATASTREAM -QDataStream &operator<<(QDataStream &d, const TQCString &s); -QDataStream &operator>>(QDataStream &d, TQCString &s); - -TQDataStream &operator<<(TQDataStream &d, const TQCString &s); -TQDataStream &operator>>(TQDataStream &d, TQCString &s); -#endif - -/***************************************************************************** - TQCString inline functions - *****************************************************************************/ - -inline TQCString &TQCString::setNum(short n) -{ return setNum(long(n)); } - -inline TQCString &TQCString::setNum(ushort n) -{ return setNum(ulong(n)); } - -inline TQCString &TQCString::setNum(int n) -{ return setNum(long(n)); } - -inline TQCString &TQCString::setNum(uint n) -{ return setNum(ulong(n)); } - -inline TQCString &TQCString::setNum(float n, char f, int prec) -{ return setNum(double(n),f,prec); } - -/***************************************************************************** - TQCString non-member operators - *****************************************************************************/ - -Q_COMPAT_EXPORT inline bool operator==(const TQCString &s1, const TQCString &s2) -{ return tqstrcmp(s1, s2) == 0; } - -Q_COMPAT_EXPORT inline bool operator==(const TQCString &s1, const char *s2) -{ return tqstrcmp(s1, s2) == 0; } - -Q_COMPAT_EXPORT inline bool operator==(const char *s1, const TQCString &s2) -{ return tqstrcmp(s1, s2) == 0; } - -Q_COMPAT_EXPORT inline bool operator!=(const TQCString &s1, const TQCString &s2) -{ return tqstrcmp(s1, s2) != 0; } - -Q_COMPAT_EXPORT inline bool operator!=(const TQCString &s1, const char *s2) -{ return tqstrcmp(s1, s2) != 0; } - -Q_COMPAT_EXPORT inline bool operator!=(const char *s1, const TQCString &s2) -{ return tqstrcmp(s1, s2) != 0; } - -Q_COMPAT_EXPORT inline bool operator<(const TQCString &s1, const TQCString& s2) -{ return tqstrcmp(s1, s2) < 0; } - -Q_COMPAT_EXPORT inline bool operator<(const TQCString &s1, const char *s2) -{ return tqstrcmp(s1, s2) < 0; } - -Q_COMPAT_EXPORT inline bool operator<(const char *s1, const TQCString &s2) -{ return tqstrcmp(s1, s2) < 0; } - -Q_COMPAT_EXPORT inline bool operator<=(const TQCString &s1, const TQCString &s2) -{ return tqstrcmp(s1, s2) <= 0; } - -Q_COMPAT_EXPORT inline bool operator<=(const TQCString &s1, const char *s2) -{ return tqstrcmp(s1, s2) <= 0; } - -Q_COMPAT_EXPORT inline bool operator<=(const char *s1, const TQCString &s2) -{ return tqstrcmp(s1, s2) <= 0; } - -Q_COMPAT_EXPORT inline bool operator>(const TQCString &s1, const TQCString &s2) -{ return tqstrcmp(s1, s2) > 0; } - -Q_COMPAT_EXPORT inline bool operator>(const TQCString &s1, const char *s2) -{ return tqstrcmp(s1, s2) > 0; } - -Q_COMPAT_EXPORT inline bool operator>(const char *s1, const TQCString &s2) -{ return tqstrcmp(s1, s2) > 0; } - -Q_COMPAT_EXPORT inline bool operator>=(const TQCString &s1, const TQCString& s2) -{ return tqstrcmp(s1, s2) >= 0; } - -Q_COMPAT_EXPORT inline bool operator>=(const TQCString &s1, const char *s2) -{ return tqstrcmp(s1, s2) >= 0; } - -Q_COMPAT_EXPORT inline bool operator>=(const char *s1, const TQCString &s2) -{ return tqstrcmp(s1, s2) >= 0; } - -Q_COMPAT_EXPORT inline const TQCString operator+(const TQCString &s1, - const TQCString &s2) -{ - TQCString tmp(s1); - tmp += s2; - return tmp; -} -Q_COMPAT_EXPORT inline const TQCString operator+(const TQCString &s1, - const QByteArray &s2) -{ - QByteArray tmp(s1); - tmp += s2; - return tmp; -} -Q_COMPAT_EXPORT inline const TQCString operator+(const QByteArray &s1, - const TQCString &s2) -{ - QByteArray tmp(s1); - tmp += s2; - return tmp; -} - -Q_COMPAT_EXPORT inline const TQCString operator+(const TQCString &s1, const char *s2) -{ - TQCString tmp(s1); - tmp += s2; - return tmp; -} - -Q_COMPAT_EXPORT inline const TQCString operator+(const char *s1, const TQCString &s2) -{ - TQCString tmp(s1); - tmp += s2; - return tmp; -} - -Q_COMPAT_EXPORT inline const TQCString operator+(const TQCString &s1, char c2) -{ - TQCString tmp(s1); - tmp += c2; - return tmp; -} - -Q_COMPAT_EXPORT inline const TQCString operator+(char c1, const TQCString &s2) -{ - TQCString tmp; - tmp += c1; - tmp += s2; - return tmp; -} - -inline uint TQCString::length() const -{ - return tqstrlen( data() ); -} - -inline bool TQCString::truncate( uint pos ) -{ - return tqresize(pos+1); -} - -QT_END_NAMESPACE - -QT_END_HEADER - -#else // USE_QT4 - -class TQRegExp; - -class TQ_EXPORT TQCString : public TQByteArray // C string class -{ -public: - TQCString() {} // make null string - TQCString( int size ); // allocate size incl. \0 - TQCString( const TQCString &s ) : TQByteArray( s ) {} - TQCString( const QByteArray ba ) : TQByteArray( ba ) {} - TQCString( const char *str ); // deep copy - TQCString( const char *str, uint maxlen ); // deep copy, max length - ~TQCString(); - - TQCString &operator=( const TQCString &s );// shallow copy - TQCString &operator=( const char *str ); // deep copy - TQCString &operator=(const QByteArray &ba); - - bool isNull() const; - bool isEmpty() const; - uint length() const; - bool resize( uint newlen ) { return tqresize(newlen); } - bool tqresize( uint newlen ); - bool truncate( uint pos ); - bool fill( char c, int len = -1 ); - - TQCString copy() const; - - TQCString &sprintf( const char *format, ... ); - - int find( char c, int index=0, bool cs=TRUE ) const; - int find( const char *str, int index=0, bool cs=TRUE ) const; -#ifndef TQT_NO_REGEXP - int find( const TQRegExp &, int index=0 ) const; -#endif - int findRev( char c, int index=-1, bool cs=TRUE) const; - int findRev( const char *str, int index=-1, bool cs=TRUE) const; -#ifndef TQT_NO_REGEXP_CAPTURE - int findRev( const TQRegExp &, int index=-1 ) const; -#endif - int contains( char c, bool cs=TRUE ) const; - int contains( const char *str, bool cs=TRUE ) const; -#ifndef TQT_NO_REGEXP - int contains( const TQRegExp & ) const; -#endif - TQCString left( uint len ) const; - TQCString right( uint len ) const; - TQCString mid( uint index, uint len=0xffffffff) const; - - TQCString leftJustify( uint width, char fill=' ', bool trunc=FALSE)const; - TQCString rightJustify( uint width, char fill=' ',bool trunc=FALSE)const; - - TQCString lower() const; - TQCString upper() const; - - TQCString stripWhiteSpace() const; - TQCString simplifyWhiteSpace() const; - - TQCString &insert( uint index, const char * ); - TQCString &insert( uint index, char ); - TQCString &append( const char * ); - TQCString &prepend( const char * ); - TQCString &remove( uint index, uint len ); - TQCString &replace( uint index, uint len, const char * ); -#ifndef TQT_NO_REGEXP - TQCString &replace( const TQRegExp &, const char * ); -#endif - TQCString &replace( char c, const char *after ); - TQCString &replace( const char *, const char * ); - TQCString &replace( char, char ); - - short toShort( bool *ok=0 ) const; - ushort toUShort( bool *ok=0 ) const; - int toInt( bool *ok=0 ) const; - uint toUInt( bool *ok=0 ) const; - long toLong( bool *ok=0 ) const; - ulong toULong( bool *ok=0 ) const; - float toFloat( bool *ok=0 ) const; - double toDouble( bool *ok=0 ) const; - - TQCString &setStr( const char *s ); - TQCString &setNum( short ); - TQCString &setNum( ushort ); - TQCString &setNum( int ); - TQCString &setNum( uint ); - TQCString &setNum( long ); - TQCString &setNum( ulong ); - TQCString &setNum( float, char f='g', int prec=6 ); - TQCString &setNum( double, char f='g', int prec=6 ); - - inline const char * tqstringFromPos( int index ) { return constData() + index; } - - bool setExpand( uint index, char c ); - - operator const char *() const; - TQCString &operator+=( const char *str ); - TQCString &operator+=( char c ); - TQCString &operator+=( const QString qs ); - TQCString &operator+=( const QByteArray qba ); - TQCString &operator+=( const TQCString tqcs ); -private: - int find( const char *str, int index, bool cs, uint l ) const; -}; - -/***************************************************************************** - TQCString stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQCString & ); -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQCString & ); -#endif - -/***************************************************************************** - TQCString inline functions - *****************************************************************************/ - -inline TQCString &TQCString::operator=( const TQCString &s ) -{ return (TQCString&)assign( s ); } - -inline TQCString &TQCString::operator=( const char *str ) -{ return (TQCString&)duplicate( str, tqstrlen(str)+1 ); } - -inline bool TQCString::isNull() const -{ return data() == 0; } - -inline bool TQCString::isEmpty() const -{ return data() == 0 || *data() == '\0'; } - -inline uint TQCString::length() const -{ return tqstrlen( data() ); } - -inline bool TQCString::truncate( uint pos ) -{ return resize(pos+1); } - -inline TQCString TQCString::copy() const -{ return TQCString( data() ); } - -inline TQCString &TQCString::prepend( const char *s ) -{ return insert(0,s); } - -inline TQCString &TQCString::append( const char *s ) -{ return operator+=(s); } - -inline TQCString &TQCString::setNum( short n ) -{ return setNum((long)n); } - -inline TQCString &TQCString::setNum( ushort n ) -{ return setNum((ulong)n); } - -inline TQCString &TQCString::setNum( int n ) -{ return setNum((long)n); } - -inline TQCString &TQCString::setNum( uint n ) -{ return setNum((ulong)n); } - -inline TQCString &TQCString::setNum( float n, char f, int prec ) -{ return setNum((double)n,f,prec); } - -inline TQCString::operator const char *() const -{ return (const char *)data(); } - - -/***************************************************************************** - TQCString non-member operators - *****************************************************************************/ - -TQ_EXPORT inline bool operator==( const TQCString &s1, const TQCString &s2 ) -{ return tqstrcmp( s1.data(), s2.data() ) == 0; } - -TQ_EXPORT inline bool operator==( const TQCString &s1, const char *s2 ) -{ return tqstrcmp( s1.data(), s2 ) == 0; } - -TQ_EXPORT inline bool operator==( const char *s1, const TQCString &s2 ) -{ return tqstrcmp( s1, s2.data() ) == 0; } - -TQ_EXPORT inline bool operator!=( const TQCString &s1, const TQCString &s2 ) -{ return tqstrcmp( s1.data(), s2.data() ) != 0; } - -TQ_EXPORT inline bool operator!=( const TQCString &s1, const char *s2 ) -{ return tqstrcmp( s1.data(), s2 ) != 0; } - -TQ_EXPORT inline bool operator!=( const char *s1, const TQCString &s2 ) -{ return tqstrcmp( s1, s2.data() ) != 0; } - -TQ_EXPORT inline bool operator<( const TQCString &s1, const TQCString& s2 ) -{ return tqstrcmp( s1.data(), s2.data() ) < 0; } - -TQ_EXPORT inline bool operator<( const TQCString &s1, const char *s2 ) -{ return tqstrcmp( s1.data(), s2 ) < 0; } - -TQ_EXPORT inline bool operator<( const char *s1, const TQCString &s2 ) -{ return tqstrcmp( s1, s2.data() ) < 0; } - -TQ_EXPORT inline bool operator<=( const TQCString &s1, const TQCString &s2 ) -{ return tqstrcmp( s1.data(), s2.data() ) <= 0; } - -TQ_EXPORT inline bool operator<=( const TQCString &s1, const char *s2 ) -{ return tqstrcmp( s1.data(), s2 ) <= 0; } - -TQ_EXPORT inline bool operator<=( const char *s1, const TQCString &s2 ) -{ return tqstrcmp( s1, s2.data() ) <= 0; } - -TQ_EXPORT inline bool operator>( const TQCString &s1, const TQCString &s2 ) -{ return tqstrcmp( s1.data(), s2.data() ) > 0; } - -TQ_EXPORT inline bool operator>( const TQCString &s1, const char *s2 ) -{ return tqstrcmp( s1.data(), s2 ) > 0; } - -TQ_EXPORT inline bool operator>( const char *s1, const TQCString &s2 ) -{ return tqstrcmp( s1, s2.data() ) > 0; } - -TQ_EXPORT inline bool operator>=( const TQCString &s1, const TQCString& s2 ) -{ return tqstrcmp( s1.data(), s2.data() ) >= 0; } - -TQ_EXPORT inline bool operator>=( const TQCString &s1, const char *s2 ) -{ return tqstrcmp( s1.data(), s2 ) >= 0; } - -TQ_EXPORT inline bool operator>=( const char *s1, const TQCString &s2 ) -{ return tqstrcmp( s1, s2.data() ) >= 0; } - -TQ_EXPORT inline const TQCString operator+( const TQCString &s1, - const TQCString &s2 ) -{ - TQCString tmp( s1.data() ); - tmp += static_cast<const char *>(s2); - return tmp; -} - -TQ_EXPORT inline const TQCString operator+( const TQCString &s1, const char *s2 ) -{ - TQCString tmp( s1.data() ); - tmp += s2; - return tmp; -} - -TQ_EXPORT inline const TQCString operator+( const char *s1, const TQCString &s2 ) -{ - TQCString tmp( s1 ); - tmp += static_cast<const char *>(s2); - return tmp; -} - -TQ_EXPORT inline const TQCString operator+( const TQCString &s1, char c2 ) -{ - TQCString tmp( s1.data() ); - tmp += c2; - return tmp; -} - -TQ_EXPORT inline const TQCString operator+( char c1, const TQCString &s2 ) -{ - TQCString tmp; - tmp += c1; - tmp += static_cast<const char *>(s2); - return tmp; -} -#include "tqwinexport.h" - -#endif // USE_QT4 - -#endif // TQCSTRING_H diff --git a/tqtinterface/qt4/src/tools/tqdatastream.cpp b/tqtinterface/qt4/src/tools/tqdatastream.cpp deleted file mode 100644 index bf9955a..0000000 --- a/tqtinterface/qt4/src/tools/tqdatastream.cpp +++ /dev/null @@ -1,1176 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQDataStream class -** -** Created : 930831 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqdatastream.h" - -#ifndef TQT_NO_DATASTREAM -#include "tqbuffer.h" -#include <stdio.h> -#include <ctype.h> -#include <stdlib.h> -#ifndef TQ_OS_TEMP -#include <locale.h> -#else -#include "tqt_windows.h" -#endif - -#ifdef USE_QT4 - -#else // USE_QT4 - -/*! - \class TQDataStream tqdatastream.h - \reentrant - \brief The TQDataStream class provides serialization of binary data - to a TQIODevice. - - \ingroup io - - A data stream is a binary stream of encoded information which is - 100% independent of the host computer's operating system, CPU or - byte order. For example, a data stream that is written by a PC - under Windows can be read by a Sun SPARC running Solaris. - - You can also use a data stream to read/write \link #raw raw - unencoded binary data\endlink. If you want a "parsing" input - stream, see TQTextStream. - - The TQDataStream class implements the serialization of C++'s basic - data types, like \c char, \c short, \c int, \c char*, etc. - Serialization of more complex data is accomplished by breaking up - the data into primitive units. - - A data stream cooperates closely with a TQIODevice. A TQIODevice - represents an input/output medium one can read data from and write - data to. The TQFile class is an example of an IO tqdevice. - - Example (write binary data to a stream): - \code - TQFile file( "file.dat" ); - file.open( IO_WriteOnly ); - TQDataStream stream( &file ); // we will serialize the data into the file - stream << "the answer is"; // serialize a string - stream << (TQ_INT32)42; // serialize an integer - \endcode - - Example (read binary data from a stream): - \code - TQFile file( "file.dat" ); - file.open( IO_ReadOnly ); - TQDataStream stream( &file ); // read the data serialized from the file - TQString str; - TQ_INT32 a; - stream >> str >> a; // extract "the answer is" and 42 - \endcode - - Each item written to the stream is written in a predefined binary - format that varies depending on the item's type. Supported TQt - types include TQBrush, TQColor, TQDateTime, TQFont, TQPixmap, TQString, - TQVariant and many others. For the complete list of all TQt types - supporting data streaming see the \link datastreamformat.html - Format of the TQDataStream operators \endlink. - - For integers it is best to always cast to a TQt integer type for - writing, and to read back into the same TQt integer type. This - ensures that you get integers of the size you want and insulates - you from compiler and platform differences. - - To take one example, a \c char* string is written as a 32-bit - integer equal to the length of the string including the NUL byte - ('\0'), followed by all the characters of the string including the - NUL byte. When reading a \c char* string, 4 bytes are read to - create the 32-bit length value, then that many characters for the - \c char* string including the NUL are read. - - The initial IODevice is usually set in the constructor, but can be - changed with setDevice(). If you've reached the end of the data - (or if there is no IODevice set) atEnd() will return TRUE. - - If you want the data to be compatible with an earlier version of - TQt use setVersion(). - - If you want the data to be human-readable, e.g. for debugging, you - can set the data stream into printable data mode with - setPrintableData(). The data is then written slower, in a bloated - but human readable format. - - If you are producing a new binary data format, such as a file - format for documents created by your application, you could use a - TQDataStream to write the data in a portable format. Typically, you - would write a brief header containing a magic string and a version - number to give yourself room for future expansion. For example: - - \code - TQFile file( "file.xxx" ); - file.open( IO_WriteOnly ); - TQDataStream stream( &file ); - - // Write a header with a "magic number" and a version - stream << (TQ_UINT32)0xA0B0C0D0; - stream << (TQ_INT32)123; - - // Write the data - stream << [lots of interesting data] - \endcode - - Then read it in with: - - \code - TQFile file( "file.xxx" ); - file.open( IO_ReadOnly ); - TQDataStream stream( &file ); - - // Read and check the header - TQ_UINT32 magic; - stream >> magic; - if ( magic != 0xA0B0C0D0 ) - return XXX_BAD_FILE_FORMAT; - - // Read the version - TQ_INT32 version; - stream >> version; - if ( version < 100 ) - return XXX_BAD_FILE_TOO_OLD; - if ( version > 123 ) - return XXX_BAD_FILE_TOO_NEW; - if ( version <= 110 ) - stream.setVersion(1); - - // Read the data - stream >> [lots of interesting data]; - if ( version > 120 ) - stream >> [data new in XXX version 1.2]; - stream >> [other interesting data]; - \endcode - - You can select which byte order to use when serializing data. The - default setting is big endian (MSB first). Changing it to little - endian breaks the portability (unless the reader also changes to - little endian). We recommend keeping this setting unless you have - special requirements. - - \target raw - \section1 Reading and writing raw binary data - - You may wish to read/write your own raw binary data to/from the - data stream directly. Data may be read from the stream into a - preallocated char* using readRawBytes(). Similarly data can be - written to the stream using writeRawBytes(). Notice that any - encoding/decoding of the data must be done by you. - - A similar pair of functions is readBytes() and writeBytes(). These - differ from their \e raw counterparts as follows: readBytes() - reads a TQ_UINT32 which is taken to be the length of the data to be - read, then that number of bytes is read into the preallocated - char*; writeBytes() writes a TQ_UINT32 containing the length of the - data, followed by the data. Notice that any encoding/decoding of - the data (apart from the length TQ_UINT32) must be done by you. - - \sa TQTextStream TQVariant -*/ - -/*! - \enum TQDataStream::ByteOrder - - The byte order used for reading/writing the data. - - \value BigEndian the default - \value LittleEndian -*/ - - -/***************************************************************************** - TQDataStream member functions - *****************************************************************************/ - -#if defined(TQT_CHECK_STATE) -#undef CHECK_STREAM_PRECOND -#define CHECK_STREAM_PRECOND if ( !dev ) { \ - qWarning( "TQDataStream: No tqdevice" ); \ - return *this; } -#else -#define CHECK_STREAM_PRECOND -#endif - -static int systemWordSize = 0; -static bool systemBigEndian; - -static const int DefaultStreamVersion = 6; -// ### On next version bump, TQPen::width() should not be restricted to 8-bit values. -// ### On next version bump, when streaming invalid TQVariants, just the type should -// be written, no "data" after it -// 6 is default in TQt 3.3 -// 5 is default in TQt 3.1 -// 4 is default in TQt 3.0 -// 3 is default in TQt 2.1 -// 2 is the TQt 2.0.x format -// 1 is the TQt 1.x format - -/*! - Constructs a data stream that has no IO tqdevice. - - \sa setDevice() -*/ - -TQDataStream::TQDataStream() -{ - if ( systemWordSize == 0 ) // get system features - qSysInfo( &systemWordSize, &systemBigEndian ); - dev = 0; // no tqdevice set - owndev = FALSE; - byteorder = BigEndian; // default byte order - printable = FALSE; - ver = DefaultStreamVersion; - noswap = systemBigEndian; -} - -/*! - Constructs a data stream that uses the IO tqdevice \a d. - - \warning If you use TQSocket or TQSocketDevice as the IO tqdevice \a d - for reading data, you must make sure that enough data is available - on the socket for the operation to successfully proceed; - TQDataStream does not have any means to handle or recover from - short-reads. - - \sa setDevice(), tqdevice() -*/ - -TQDataStream::TQDataStream( TQIODevice *d ) -{ - if ( systemWordSize == 0 ) // get system features - qSysInfo( &systemWordSize, &systemBigEndian ); - dev = d; // set tqdevice - owndev = FALSE; - byteorder = BigEndian; // default byte order - printable = FALSE; - ver = DefaultStreamVersion; - noswap = systemBigEndian; -} - -/*! - Constructs a data stream that operates on a byte array, \a a, - through an internal TQBuffer tqdevice. The \a mode is a - TQIODevice::mode(), usually either \c IO_ReadOnly or \c - IO_WriteOnly. - - Example: - \code - static char bindata[] = { 231, 1, 44, ... }; - TQByteArray a; - a.setRawData( bindata, sizeof(bindata) ); // a points to bindata - TQDataStream stream( a, IO_ReadOnly ); // open on a's data - stream >> [something]; // read raw bindata - a.resetRawData( bindata, sizeof(bindata) ); // finished - \endcode - - The TQByteArray::setRawData() function is not for the inexperienced. -*/ - -TQDataStream::TQDataStream( TQByteArray a, int mode ) -{ - if ( systemWordSize == 0 ) // get system features - qSysInfo( &systemWordSize, &systemBigEndian ); - dev = new TQBuffer( a ); // create tqdevice - ((TQBuffer *)dev)->open( mode ); // open tqdevice - owndev = TRUE; - byteorder = BigEndian; // default byte order - printable = FALSE; - ver = DefaultStreamVersion; - noswap = systemBigEndian; -} - -/*! - Destroys the data stream. - - The destructor will not affect the current IO tqdevice, unless it is - an internal IO tqdevice processing a TQByteArray passed in the \e - constructor, in which case the internal IO tqdevice is destroyed. -*/ - -TQDataStream::~TQDataStream() -{ - if ( owndev ) - delete dev; -} - - -/*! - \fn TQIODevice *TQDataStream::tqdevice() const - - Returns the IO tqdevice currently set. - - \sa setDevice(), unsetDevice() -*/ - -/*! - void TQDataStream::setDevice(TQIODevice *d ) - - Sets the IO tqdevice to \a d. - - \sa tqdevice(), unsetDevice() -*/ - -void TQDataStream::setDevice(TQIODevice *d ) -{ - if ( owndev ) { - delete dev; - owndev = FALSE; - } - dev = d; -} - -/*! - Unsets the IO tqdevice. This is the same as calling setDevice( 0 ). - - \sa tqdevice(), setDevice() -*/ - -void TQDataStream::unsetDevice() -{ - setDevice( 0 ); -} - - -/*! - \fn bool TQDataStream::atEnd() const - - Returns TRUE if the IO tqdevice has reached the end position (end of - the stream or file) or if there is no IO tqdevice set; otherwise - returns FALSE, i.e. if the current position of the IO tqdevice is - before the end position. - - \sa TQIODevice::atEnd() -*/ - -/*!\fn bool TQDataStream::eof() const - - \obsolete - - Returns TRUE if the IO tqdevice has reached the end position (end of - stream or file) or if there is no IO tqdevice set. - - Returns FALSE if the current position of the read/write head of the IO - tqdevice is somewhere before the end position. - - \sa TQIODevice::atEnd() -*/ - -/*! - \fn int TQDataStream::byteOrder() const - - Returns the current byte order setting -- either \c BigEndian or - \c LittleEndian. - - \sa setByteOrder() -*/ - -/*! - Sets the serialization byte order to \a bo. - - The \a bo parameter can be \c TQDataStream::BigEndian or \c - TQDataStream::LittleEndian. - - The default setting is big endian. We recommend leaving this - setting unless you have special requirements. - - \sa byteOrder() -*/ - -void TQDataStream::setByteOrder( int bo ) -{ - byteorder = bo; - if ( systemBigEndian ) - noswap = byteorder == BigEndian; - else - noswap = byteorder == LittleEndian; -} - - -/*! - \fn bool TQDataStream::isPrintableData() const - - Returns TRUE if the printable data flag has been set; otherwise - returns FALSE. - - \sa setPrintableData() -*/ - -/*! - \fn void TQDataStream::setPrintableData( bool enable ) - - If \a enable is TRUE, data will be output in a human readable - format. If \a enable is FALSE, data will be output in a binary - format. - - If \a enable is TRUE, the write functions will generate output - that consists of printable characters (7 bit ASCII). This output - will typically be a lot larger than the default binary output, and - consequently slower to write. - - We recommend only enabling printable data for debugging purposes. -*/ - - -/*! - \fn int TQDataStream::version() const - - Returns the version number of the data serialization format. In TQt - 3.1, this number is 5. - - \sa setVersion() -*/ - -/*! - \fn void TQDataStream::setVersion( int v ) - - Sets the version number of the data serialization format to \a v. - - You don't need to set a version if you are using the current - version of TQt. - - In order to accommodate new functionality, the datastream - serialization format of some TQt classes has changed in some - versions of TQt. If you want to read data that was created by an - earlier version of TQt, or write data that can be read by a program - that was compiled with an earlier version of TQt, use this function - to modify the serialization format of TQDataStream. - - \table - \header \i TQt Version \i TQDataStream Version - \row \i TQt 3.3 \i11 6 - \row \i TQt 3.2 \i11 5 - \row \i TQt 3.1 \i11 5 - \row \i TQt 3.0 \i11 4 - \row \i TQt 2.1.x and TQt 2.2.x \i11 3 - \row \i TQt 2.0.x \i11 2 - \row \i TQt 1.x \i11 1 - \endtable - - \sa version() -*/ - -/***************************************************************************** - TQDataStream read functions - *****************************************************************************/ - -#if defined(TQ_OS_HPUX) && !defined(__LP64__) -extern "C" long long __strtoll( const char *, char**, int ); -#endif - -static TQ_INT64 read_int_ascii( TQDataStream *s ) -{ - register int n = 0; - char buf[40]; - for ( ;; ) { - buf[n] = s->tqdevice()->getch(); - if ( buf[n] == '\n' || n > 38 ) // $-terminator - break; - n++; - } - buf[n] = '\0'; - -#if defined(__LP64__) || defined(TQ_OS_OSF) - // sizeof(long) == 8 - return strtol(buf, (char **)0, 10); -#else -# if defined(TQ_OS_TEMP) - return strtol( buf, (char**)0, 10 ); -# elif defined(TQ_OS_WIN) - return _atoi64( buf ); -# elif defined(TQ_OS_HPUX) - return __strtoll( buf, (char**)0, 10 ); -# elif defined(TQ_OS_MACX) && defined(TQT_MACOSX_VERSION) && TQT_MACOSX_VERSION < 0x1020 - return strtoq( buf, (char**)0, 10 ); -# else - return strtoll( buf, (char**)0, 10 ); // C99 function -# endif -#endif -} - -/*! - \overload TQDataStream &TQDataStream::operator>>( TQ_UINT8 &i ) - - Reads an unsigned byte from the stream into \a i, and returns a - reference to the stream. -*/ - -/*! - Reads a signed byte from the stream into \a i, and returns a - reference to the stream. -*/ - -TQDataStream &TQDataStream::operator>>( TQ_INT8 &i ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - i = (TQ_INT8)dev->getch(); - if ( i == '\\' ) { // read octal code - char buf[4]; - dev->readBlock( buf, 3 ); - i = (buf[2] & 0x07)+((buf[1] & 0x07) << 3)+((buf[0] & 0x07) << 6); - } - } else { // data or text - i = (TQ_INT8)dev->getch(); - } - return *this; -} - - -/*! - \overload TQDataStream &TQDataStream::operator>>( TQ_UINT16 &i ) - - Reads an unsigned 16-bit integer from the stream into \a i, and - returns a reference to the stream. -*/ - -/*! - \overload - - Reads a signed 16-bit integer from the stream into \a i, and - returns a reference to the stream. -*/ - -TQDataStream &TQDataStream::operator>>( TQ_INT16 &i ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - i = (TQ_INT16)read_int_ascii( this ); - } else if ( noswap ) { // no conversion needed - dev->readBlock( (char *)&i, sizeof(TQ_INT16) ); - } else { // swap bytes - register uchar *p = (uchar *)(&i); - char b[2]; - dev->readBlock( b, 2 ); - *p++ = b[1]; - *p = b[0]; - } - return *this; -} - - -/*! - \overload TQDataStream &TQDataStream::operator>>( TQ_UINT32 &i ) - - Reads an unsigned 32-bit integer from the stream into \a i, and - returns a reference to the stream. -*/ - -/*! - \overload - - Reads a signed 32-bit integer from the stream into \a i, and - returns a reference to the stream. -*/ - -TQDataStream &TQDataStream::operator>>( TQ_INT32 &i ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - i = (TQ_INT32)read_int_ascii( this ); - } else if ( noswap ) { // no conversion needed - dev->readBlock( (char *)&i, sizeof(TQ_INT32) ); - } else { // swap bytes - uchar *p = (uchar *)(&i); - char b[4]; - dev->readBlock( b, 4 ); - *p++ = b[3]; - *p++ = b[2]; - *p++ = b[1]; - *p = b[0]; - } - return *this; -} - -/*! - \overload TQDataStream &TQDataStream::operator>>( TQ_UINT64 &i ) - - Reads an unsigned 64-bit integer from the stream, into \a i, and - returns a reference to the stream. -*/ - -/*! - \overload - - Reads a signed 64-bit integer from the stream into \a i, and - returns a reference to the stream. -*/ - -TQDataStream &TQDataStream::operator>>( TQ_INT64 &i ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - i = read_int_ascii( this ); - } else if ( version() < 6 ) { - TQ_UINT32 i1, i2; - *this >> i2 >> i1; - i = ((TQ_UINT64)i1 << 32) + i2; - } else if ( noswap ) { // no conversion needed - dev->readBlock( (char *)&i, sizeof(TQ_INT64) ); - } else { // swap bytes - uchar *p = (uchar *)(&i); - char b[8]; - dev->readBlock( b, 8 ); - *p++ = b[7]; - *p++ = b[6]; - *p++ = b[5]; - *p++ = b[4]; - *p++ = b[3]; - *p++ = b[2]; - *p++ = b[1]; - *p = b[0]; - } - return *this; -} - - -/*! - \overload TQDataStream &TQDataStream::operator>>( TQ_ULONG &i ) - - Reads an unsigned integer of the system's word length from the - stream, into \a i, and returns a reference to the stream. -*/ - -#if !defined(TQ_OS_WIN64) -/*! - \overload - - Reads a signed integer of the system's word length from the stream - into \a i, and returns a reference to the stream. - -*/ - -TQDataStream &TQDataStream::operator>>( TQ_LONG &i ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - i = (TQ_LONG)read_int_ascii( this ); - } else if ( noswap ) { // no conversion needed - dev->readBlock( (char *)&i, sizeof(TQ_LONG) ); - } else { // swap bytes - register uchar *p = (uchar *)(&i); - char b[sizeof(TQ_LONG)]; - dev->readBlock( b, sizeof(TQ_LONG) ); - for ( int j = sizeof(TQ_LONG); j; ) - *p++ = b[--j]; - } - return *this; -} -#endif - -static double read_double_ascii( TQDataStream *s ) -{ - register int n = 0; - char buf[80]; - for ( ;; ) { - buf[n] = s->tqdevice()->getch(); - if ( buf[n] == '\n' || n > 78 ) // $-terminator - break; - n++; - } - buf[n] = '\0'; - return atof( buf ); -} - - -/*! - \overload - - Reads a 32-bit floating point number from the stream into \a f, - using the standard IEEE754 format. Returns a reference to the - stream. -*/ - -TQDataStream &TQDataStream::operator>>( float &f ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - f = (float)read_double_ascii( this ); - } else if ( noswap ) { // no conversion needed - dev->readBlock( (char *)&f, sizeof(float) ); - } else { // swap bytes - uchar *p = (uchar *)(&f); - char b[4]; - dev->readBlock( b, 4 ); - *p++ = b[3]; - *p++ = b[2]; - *p++ = b[1]; - *p = b[0]; - } - return *this; -} - - -/*! - \overload - - Reads a 64-bit floating point number from the stream into \a f, - using the standard IEEE754 format. Returns a reference to the - stream. -*/ - -TQDataStream &TQDataStream::operator>>( double &f ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - f = read_double_ascii( this ); - } else if ( noswap ) { // no conversion needed - dev->readBlock( (char *)&f, sizeof(double) ); - } else { // swap bytes - register uchar *p = (uchar *)(&f); - char b[8]; - dev->readBlock( b, 8 ); - *p++ = b[7]; - *p++ = b[6]; - *p++ = b[5]; - *p++ = b[4]; - *p++ = b[3]; - *p++ = b[2]; - *p++ = b[1]; - *p = b[0]; - } - return *this; -} - - -/*! - \overload - - Reads the '\0'-terminated string \a s from the stream and returns - a reference to the stream. - - Space for the string is allocated using \c new -- the caller must - destroy it with delete[]. -*/ - -TQDataStream &TQDataStream::operator>>( char *&s ) -{ - uint len = 0; - return readBytes( s, len ); -} - - -/*! - Reads the buffer \a s from the stream and returns a reference to - the stream. - - The buffer \a s is allocated using \c new. Destroy it with the \c - delete[] operator. If the length is zero or \a s cannot be - allocated, \a s is set to 0. - - The \a l parameter will be set to the length of the buffer. - - The serialization format is a TQ_UINT32 length specifier first, - then \a l bytes of data. Note that the data is \e not encoded. - - \sa readRawBytes(), writeBytes() -*/ - -TQDataStream &TQDataStream::readBytes( char *&s, uint &l ) -{ - CHECK_STREAM_PRECOND - TQ_UINT32 len; - *this >> len; // first read length spec - l = (uint)len; - if ( len == 0 || eof() ) { - s = 0; - return *this; - } else { - s = new char[len]; // create char array - TQ_CHECK_PTR( s ); - if ( !s ) // no memory - return *this; - return readRawBytes( s, (uint)len ); - } -} - - -/*! - Reads \a len bytes from the stream into \a s and returns a - reference to the stream. - - The buffer \a s must be preallocated. The data is \e not encoded. - - \sa readBytes(), TQIODevice::readBlock(), writeRawBytes() -*/ - -TQDataStream &TQDataStream::readRawBytes( char *s, uint len ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - register TQ_INT8 *p = (TQ_INT8*)s; - if ( version() < 4 ) { - while ( len-- ) { - TQ_INT32 tmp; - *this >> tmp; - *p++ = tmp; - } - } else { - while ( len-- ) - *this >> *p++; - } - } else { // read data char array - dev->readBlock( s, len ); - } - return *this; -} - - -/***************************************************************************** - TQDataStream write functions - *****************************************************************************/ - - -/*! - \overload TQDataStream &TQDataStream::operator<<( TQ_UINT8 i ) - - Writes an unsigned byte, \a i, to the stream and returns a - reference to the stream. -*/ - -/*! - Writes a signed byte, \a i, to the stream and returns a reference - to the stream. -*/ - -TQDataStream &TQDataStream::operator<<( TQ_INT8 i ) -{ - CHECK_STREAM_PRECOND - if ( printable && (i == '\\' || !isprint((uchar) i)) ) { - char buf[6]; // write octal code - buf[0] = '\\'; - buf[1] = '0' + ((i >> 6) & 0x07); - buf[2] = '0' + ((i >> 3) & 0x07); - buf[3] = '0' + (i & 0x07); - buf[4] = '\0'; - dev->writeBlock( buf, 4 ); - } else { - dev->putch( i ); - } - return *this; -} - - -/*! - \overload TQDataStream &TQDataStream::operator<<( TQ_UINT16 i ) - - Writes an unsigned 16-bit integer, \a i, to the stream and returns - a reference to the stream. -*/ - -/*! - \overload - - Writes a signed 16-bit integer, \a i, to the stream and returns a - reference to the stream. -*/ - -TQDataStream &TQDataStream::operator<<( TQ_INT16 i ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - char buf[16]; - sprintf( buf, "%d\n", i ); - dev->writeBlock( buf, strlen(buf) ); - } else if ( noswap ) { // no conversion needed - dev->writeBlock( (char *)&i, sizeof(TQ_INT16) ); - } else { // swap bytes - register uchar *p = (uchar *)(&i); - char b[2]; - b[1] = *p++; - b[0] = *p; - dev->writeBlock( b, 2 ); - } - return *this; -} - -/*! - \overload - - Writes a signed 32-bit integer, \a i, to the stream and returns a - reference to the stream. -*/ - -TQDataStream &TQDataStream::operator<<( TQ_INT32 i ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - char buf[16]; - sprintf( buf, "%d\n", i ); - dev->writeBlock( buf, strlen(buf) ); - } else if ( noswap ) { // no conversion needed - dev->writeBlock( (char *)&i, sizeof(TQ_INT32) ); - } else { // swap bytes - register uchar *p = (uchar *)(&i); - char b[4]; - b[3] = *p++; - b[2] = *p++; - b[1] = *p++; - b[0] = *p; - dev->writeBlock( b, 4 ); - } - return *this; -} - -/*! - \overload TQDataStream &TQDataStream::operator<<( TQ_UINT64 i ) - - Writes an unsigned 64-bit integer, \a i, to the stream and returns a - reference to the stream. -*/ - -/*! - \overload - - Writes a signed 64-bit integer, \a i, to the stream and returns a - reference to the stream. -*/ - -TQDataStream &TQDataStream::operator<<( TQ_INT64 i ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - char buf[16]; -#ifdef TQ_OS_WIN - sprintf( buf, "%I64d\n", i ); -#else - sprintf( buf, "%lld\n", i ); -#endif - dev->writeBlock( buf, strlen(buf) ); - } else if ( version() < 6 ) { - TQ_UINT32 i1 = i & 0xffffffff; - TQ_UINT32 i2 = i >> 32; - *this << i2 << i1; - } else if ( noswap ) { // no conversion needed - dev->writeBlock( (char *)&i, sizeof(TQ_INT64) ); - } else { // swap bytes - register uchar *p = (uchar *)(&i); - char b[8]; - b[7] = *p++; - b[6] = *p++; - b[5] = *p++; - b[4] = *p++; - b[3] = *p++; - b[2] = *p++; - b[1] = *p++; - b[0] = *p; - dev->writeBlock( b, 8 ); - } - return *this; -} - -/*! - \overload TQDataStream &TQDataStream::operator<<( TQ_ULONG i ) - - Writes an unsigned integer \a i, of the system's word length, to - the stream and returns a reference to the stream. -*/ - -#if !defined(TQ_OS_WIN64) -/*! - \overload - - Writes a signed integer \a i, of the system's word length, to the - stream and returns a reference to the stream. -*/ - -TQDataStream &TQDataStream::operator<<( TQ_LONG i ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - char buf[20]; - sprintf( buf, "%ld\n", i ); - dev->writeBlock( buf, strlen(buf) ); - } else if ( noswap ) { // no conversion needed - dev->writeBlock( (char *)&i, sizeof(TQ_LONG) ); - } else { // swap bytes - register uchar *p = (uchar *)(&i); - char b[sizeof(TQ_LONG)]; - for ( int j = sizeof(TQ_LONG); j; ) - b[--j] = *p++; - dev->writeBlock( b, sizeof(TQ_LONG) ); - } - return *this; -} -#endif - - -/*! - \overload TQDataStream &TQDataStream::operator<<( TQ_UINT32 i ) - - Writes an unsigned integer, \a i, to the stream as a 32-bit - unsigned integer (TQ_UINT32). Returns a reference to the stream. -*/ - -/*! - \overload - - Writes a 32-bit floating point number, \a f, to the stream using - the standard IEEE754 format. Returns a reference to the stream. -*/ - -TQDataStream &TQDataStream::operator<<( float f ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - TQString num = TQString::number((double)f); - dev->writeBlock(num.latin1(), num.length()); - dev->putch('\n'); - } else { - float g = f; // fixes float-on-stack problem - if ( noswap ) { // no conversion needed - dev->writeBlock( (char *)&g, sizeof(float) ); - } else { // swap bytes - register uchar *p = (uchar *)(&g); - char b[4]; - b[3] = *p++; - b[2] = *p++; - b[1] = *p++; - b[0] = *p; - dev->writeBlock( b, 4 ); - } - } - return *this; -} - - -/*! - \overload - - Writes a 64-bit floating point number, \a f, to the stream using - the standard IEEE754 format. Returns a reference to the stream. -*/ - -TQDataStream &TQDataStream::operator<<( double f ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // printable data - TQString num = TQString::number((double)f); - dev->writeBlock(num.latin1(), num.length()); - dev->putch('\n'); - } else if ( noswap ) { // no conversion needed - dev->writeBlock( (char *)&f, sizeof(double) ); - } else { // swap bytes - register uchar *p = (uchar *)(&f); - char b[8]; - b[7] = *p++; - b[6] = *p++; - b[5] = *p++; - b[4] = *p++; - b[3] = *p++; - b[2] = *p++; - b[1] = *p++; - b[0] = *p; - dev->writeBlock( b, 8 ); - } - return *this; -} - - -/*! - \overload - - Writes the '\0'-terminated string \a s to the stream and returns a - reference to the stream. - - The string is serialized using writeBytes(). -*/ - -TQDataStream &TQDataStream::operator<<( const char *s ) -{ - if ( !s ) { - *this << (TQ_UINT32)0; - return *this; - } - uint len = tqstrlen( s ) + 1; // also write null terminator - *this << (TQ_UINT32)len; // write length specifier - return writeRawBytes( s, len ); -} - - -/*! - Writes the length specifier \a len and the buffer \a s to the - stream and returns a reference to the stream. - - The \a len is serialized as a TQ_UINT32, followed by \a len bytes - from \a s. Note that the data is \e not encoded. - - \sa writeRawBytes(), readBytes() -*/ - -TQDataStream &TQDataStream::writeBytes(const char *s, uint len) -{ - CHECK_STREAM_PRECOND - *this << (TQ_UINT32)len; // write length specifier - if ( len ) - writeRawBytes( s, len ); - return *this; -} - - -/*! - Writes \a len bytes from \a s to the stream and returns a - reference to the stream. The data is \e not encoded. - - \sa writeBytes(), TQIODevice::writeBlock(), readRawBytes() -*/ - -TQDataStream &TQDataStream::writeRawBytes( const char *s, uint len ) -{ - CHECK_STREAM_PRECOND - if ( printable ) { // write printable - if ( version() < 4 ) { - register char *p = (char *)s; - while ( len-- ) - *this << *p++; - } else { - register TQ_INT8 *p = (TQ_INT8*)s; - while ( len-- ) - *this << *p++; - } - } else { // write data char array - dev->writeBlock( s, len ); - } - return *this; -} - -#endif // TQT_NO_DATASTREAM - -#endif // USE_QT4 diff --git a/tqtinterface/qt4/src/tools/tqdatastream.h b/tqtinterface/qt4/src/tools/tqdatastream.h deleted file mode 100644 index f47847f..0000000 --- a/tqtinterface/qt4/src/tools/tqdatastream.h +++ /dev/null @@ -1,353 +0,0 @@ -/**************************************************************************** -** -** Definition of TQDataStream class -** -** Created : 930831 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQDATASTREAM_H -#define TQDATASTREAM_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqiodevice.h" -#include "tqstring.h" -#endif // TQT_H - -#ifdef USE_QT4 - -#include <Qt/qdatastream.h> - -#endif // USE_QT4 - -#ifdef USE_QT4 -class TQ_EXPORT TQDataStream : public QDataStream -{ -public: - TQDataStream() : QDataStream() {} - TQDataStream( QIODevice * tio ) : QDataStream( tio ) {} - TQDataStream( QByteArray &ba, int mode ) : QDataStream( &ba, (QIODevice::OpenModeFlag)mode ) {} - TQDataStream( TQByteArray &ba, int mode ) : QDataStream( &ba, (QIODevice::OpenModeFlag)mode ) {} -// TQDataStream( const TQByteArray &ba, int mode ) : QDataStream( &const_cast<TQByteArray&>(ba), (QIODevice::OpenModeFlag)mode ) {} - TQDataStream( const TQByteArray &ba, int mode ) : QDataStream( static_cast<const QByteArray&>(ba) ) { TQ_UNUSED(mode); } -// TQDataStream( const QByteArray &ba, int mode ) : QDataStream( ba ) { TQ_UNUSED(mode); } - inline QDataStream &readRawBytes(char *str, uint len) { readRawData(str, static_cast<int>(len)); return *this; } - inline QDataStream &writeRawBytes(const char *str, uint len) { writeRawData(str, static_cast<int>(len)); return *this; } - inline bool isPrintableData() const { return false; } - inline void setPrintableData(bool) {} - inline TQIODevice *tqdevice() const { return static_cast<TQIODevice*>(device()); } - inline bool eof() const { return atEnd(); } - - TQDataStream &operator>>( TQ_INT8 &i ); - TQDataStream &operator>>( TQ_UINT8 &i ); - TQDataStream &operator>>( TQ_INT16 &i ); - TQDataStream &operator>>( TQ_UINT16 &i ); - TQDataStream &operator>>( TQ_INT32 &i ); - TQDataStream &operator>>( TQ_UINT32 &i ); - TQDataStream &operator>>( TQ_INT64 &i ); - TQDataStream &operator>>( TQ_UINT64 &i ); -#if !defined(TQ_OS_WIN64) - TQDataStream &operator>>( TQ_LONG &i ); - TQDataStream &operator>>( TQ_ULONG &i ); -#endif - - TQDataStream &operator>>( float &f ); - TQDataStream &operator>>( double &f ); - TQDataStream &operator>>( char *&str ); - - TQDataStream &operator>>( bool &i ); - - TQDataStream &operator<<( TQ_INT8 i ); - TQDataStream &operator<<( TQ_UINT8 i ); - TQDataStream &operator<<( TQ_INT16 i ); - TQDataStream &operator<<( TQ_UINT16 i ); - TQDataStream &operator<<( TQ_INT32 i ); - TQDataStream &operator<<( TQ_UINT32 i ); - TQDataStream &operator<<( TQ_INT64 i ); - TQDataStream &operator<<( TQ_UINT64 i ); -#if !defined(TQ_OS_WIN64) - TQDataStream &operator<<( TQ_LONG i ); - TQDataStream &operator<<( TQ_ULONG i ); -#endif - TQDataStream &operator<<( float f ); - TQDataStream &operator<<( double f ); - TQDataStream &operator<<( const char *str ); - - TQDataStream &operator<<( bool i ); -}; - -inline TQDataStream &TQDataStream::operator>>( bool &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((bool&)i)); } - -inline TQDataStream &TQDataStream::operator>>( float &f ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((float&)f)); } - -inline TQDataStream &TQDataStream::operator>>( double &d ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((double&)d)); } - -inline TQDataStream &TQDataStream::operator>>( char *&str ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((char*&)str)); } - -inline TQDataStream &TQDataStream::operator>>( TQ_INT8 &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((TQ_INT8&)i)); } - -inline TQDataStream &TQDataStream::operator>>( TQ_INT16 &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((TQ_INT16&)i)); } - -inline TQDataStream &TQDataStream::operator>>( TQ_INT32 &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((TQ_INT32&)i)); } - -inline TQDataStream &TQDataStream::operator>>( TQ_INT64 &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((TQ_INT64&)i)); } - -#if !defined(TQ_OS_WIN64) -inline TQDataStream &TQDataStream::operator>>( TQ_LONG &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((qint64&)i)); } -#endif - -inline TQDataStream &TQDataStream::operator>>( TQ_UINT8 &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((TQ_INT8&)i)); } - -inline TQDataStream &TQDataStream::operator>>( TQ_UINT16 &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((TQ_INT16&)i)); } - -inline TQDataStream &TQDataStream::operator>>( TQ_UINT32 &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((TQ_INT32&)i)); } - -inline TQDataStream &TQDataStream::operator>>( TQ_UINT64 &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((TQ_INT64&)i)); } - -#if !defined(TQ_OS_WIN64) -inline TQDataStream &TQDataStream::operator>>( TQ_ULONG &i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator>>((quint64&)i)); } -#endif - -inline TQDataStream &TQDataStream::operator<<( bool i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((bool)i)); } - -inline TQDataStream &TQDataStream::operator<<( float f ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((float)f)); } - -inline TQDataStream &TQDataStream::operator<<( double d ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((double)d)); } - -inline TQDataStream &TQDataStream::operator<<( const char *str ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((const char*)str)); } - -inline TQDataStream &TQDataStream::operator<<( TQ_INT8 i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((TQ_INT8)i)); } - -inline TQDataStream &TQDataStream::operator<<( TQ_INT16 i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((TQ_INT16)i)); } - -inline TQDataStream &TQDataStream::operator<<( TQ_INT32 i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((TQ_INT32)i)); } - -inline TQDataStream &TQDataStream::operator<<( TQ_INT64 i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((TQ_INT64)i)); } - -#if !defined(TQ_OS_WIN64) -inline TQDataStream &TQDataStream::operator<<( TQ_LONG i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((qint64)i)); } -#endif - -inline TQDataStream &TQDataStream::operator<<( TQ_UINT8 i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((TQ_INT8)i)); } - -inline TQDataStream &TQDataStream::operator<<( TQ_UINT16 i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((TQ_INT16)i)); } - -inline TQDataStream &TQDataStream::operator<<( TQ_UINT32 i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((TQ_INT32)i)); } - -inline TQDataStream &TQDataStream::operator<<( TQ_UINT64 i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((TQ_INT64)i)); } - -#if !defined(TQ_OS_WIN64) -inline TQDataStream &TQDataStream::operator<<( TQ_ULONG i ) -{ return static_cast<TQDataStream&>(this->QDataStream::operator<<((quint64)i)); } -#endif - -#else // USE_QT4 - -#ifndef TQT_NO_DATASTREAM -class TQ_EXPORT TQDataStream // data stream class -{ -public: - TQDataStream(); - TQDataStream( TQIODevice * ); - TQDataStream( TQByteArray, int mode ); - virtual ~TQDataStream(); - - TQIODevice *tqdevice() const; - void setDevice( TQIODevice * ); - void unsetDevice(); - - bool atEnd() const; - bool eof() const; - - enum ByteOrder { BigEndian, LittleEndian }; - int byteOrder() const; - void setByteOrder( int ); - - bool isPrintableData() const; - void setPrintableData( bool ); - - int version() const; - void setVersion( int ); - - TQDataStream &operator>>( TQ_INT8 &i ); - TQDataStream &operator>>( TQ_UINT8 &i ); - TQDataStream &operator>>( TQ_INT16 &i ); - TQDataStream &operator>>( TQ_UINT16 &i ); - TQDataStream &operator>>( TQ_INT32 &i ); - TQDataStream &operator>>( TQ_UINT32 &i ); - TQDataStream &operator>>( TQ_INT64 &i ); - TQDataStream &operator>>( TQ_UINT64 &i ); -#if !defined(TQ_OS_WIN64) - TQDataStream &operator>>( TQ_LONG &i ); - TQDataStream &operator>>( TQ_ULONG &i ); -#endif - - TQDataStream &operator>>( float &f ); - TQDataStream &operator>>( double &f ); - TQDataStream &operator>>( char *&str ); - - TQDataStream &operator<<( TQ_INT8 i ); - TQDataStream &operator<<( TQ_UINT8 i ); - TQDataStream &operator<<( TQ_INT16 i ); - TQDataStream &operator<<( TQ_UINT16 i ); - TQDataStream &operator<<( TQ_INT32 i ); - TQDataStream &operator<<( TQ_UINT32 i ); - TQDataStream &operator<<( TQ_INT64 i ); - TQDataStream &operator<<( TQ_UINT64 i ); -#if !defined(TQ_OS_WIN64) - TQDataStream &operator<<( TQ_LONG i ); - TQDataStream &operator<<( TQ_ULONG i ); -#endif - TQDataStream &operator<<( float f ); - TQDataStream &operator<<( double f ); - TQDataStream &operator<<( const char *str ); - - TQDataStream &readBytes( char *&, uint &len ); - TQDataStream &readRawBytes( char *, uint len ); - - TQDataStream &writeBytes( const char *, uint len ); - TQDataStream &writeRawBytes( const char *, uint len ); - -private: - TQIODevice *dev; - bool owndev; - int byteorder; - bool printable; - bool noswap; - int ver; - -private: // Disabled copy constructor and operator= -#if defined(TQ_DISABLE_COPY) - TQDataStream( const TQDataStream & ); - TQDataStream &operator=( const TQDataStream & ); -#endif -}; - - -/***************************************************************************** - TQDataStream inline functions - *****************************************************************************/ - -inline TQIODevice *TQDataStream::tqdevice() const -{ return dev; } - -inline bool TQDataStream::atEnd() const -{ return dev ? dev->atEnd() : TRUE; } - -inline bool TQDataStream::eof() const -{ return atEnd(); } - -inline int TQDataStream::byteOrder() const -{ return byteorder; } - -inline bool TQDataStream::isPrintableData() const -{ return printable; } - -inline void TQDataStream::setPrintableData( bool p ) -{ printable = p; } - -inline int TQDataStream::version() const -{ return ver; } - -inline void TQDataStream::setVersion( int v ) -{ ver = v; } - -inline TQDataStream &TQDataStream::operator>>( TQ_UINT8 &i ) -{ return *this >> (TQ_INT8&)i; } - -inline TQDataStream &TQDataStream::operator>>( TQ_UINT16 &i ) -{ return *this >> (TQ_INT16&)i; } - -inline TQDataStream &TQDataStream::operator>>( TQ_UINT32 &i ) -{ return *this >> (TQ_INT32&)i; } - -inline TQDataStream &TQDataStream::operator>>( TQ_UINT64 &i ) -{ return *this >> (TQ_INT64&)i; } - -#if !defined(TQ_OS_WIN64) -inline TQDataStream &TQDataStream::operator>>( TQ_ULONG &i ) -{ return *this >> (TQ_LONG&)i; } -#endif - -inline TQDataStream &TQDataStream::operator<<( TQ_UINT8 i ) -{ return *this << (TQ_INT8)i; } - -inline TQDataStream &TQDataStream::operator<<( TQ_UINT16 i ) -{ return *this << (TQ_INT16)i; } - -inline TQDataStream &TQDataStream::operator<<( TQ_UINT32 i ) -{ return *this << (TQ_INT32)i; } - -inline TQDataStream &TQDataStream::operator<<( TQ_UINT64 i ) -{ return *this << (TQ_INT64)i; } - -#if !defined(TQ_OS_WIN64) -inline TQDataStream &TQDataStream::operator<<( TQ_ULONG i ) -{ return *this << (TQ_LONG)i; } -#endif - -#endif // USE_QT4 - -#endif // TQT_NO_DATASTREAM -#endif // TQDATASTREAM_H diff --git a/tqtinterface/qt4/src/tools/tqdatetime.cpp b/tqtinterface/qt4/src/tools/tqdatetime.cpp deleted file mode 100644 index 2b28868..0000000 --- a/tqtinterface/qt4/src/tools/tqdatetime.cpp +++ /dev/null @@ -1,2606 +0,0 @@ -/**************************************************************************** -** -** Implementation of date and time classes -** -** Created : 940124 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" - -#include "tqdatetime.h" -#include "tqdatastream.h" -#include "tqregexp.h" - -#ifdef USE_QT4 - -#else // USE_QT4 - -#include <stdio.h> -#ifndef TQ_OS_TEMP -#include <time.h> -#endif - -#if defined(TQ_OS_WIN32) -#include <windows.h> -#endif - -static const uint FIRST_DAY = 2361222; // Julian day for 1752-09-14 -static const int FIRST_YEAR = 1752; // ### wrong for many countries -static const uint SECS_PER_DAY = 86400; -static const uint MSECS_PER_DAY = 86400000; -static const uint SECS_PER_HOUR = 3600; -static const uint MSECS_PER_HOUR= 3600000; -static const uint SECS_PER_MIN = 60; -static const uint MSECS_PER_MIN = 60000; - -static const short monthDays[] = { - 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - -static const char * const qt_shortMonthNames[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - -#ifndef TQT_NO_DATESTRING -/***************************************************************************** - Some static function used by TQDate, TQTime and TQDateTime - *****************************************************************************/ - -// Replaces tokens by their value. See TQDateTime::toString() for a list of valid tokens -static TQString getFmtString( const TQString& f, const TQTime* dt = 0, const TQDate* dd = 0, bool am_pm = FALSE ) -{ - if ( f.isEmpty() ) - return TQString::null; - - TQString buf = f; - - if ( dt ) { - if ( f == "h" ) { - if ( ( am_pm ) && ( dt->hour() > 12 ) ) - buf = TQString::number( dt->hour() - 12 ); - else if ( ( am_pm ) && ( dt->hour() == 0 ) ) - buf = "12"; - else - buf = TQString::number( dt->hour() ); - } else if ( f == "hh" ) { - if ( ( am_pm ) && ( dt->hour() > 12 ) ) - buf = TQT_TQSTRING(TQString::number( dt->hour() - 12 )).rightJustify( 2, '0', TRUE ); - else if ( ( am_pm ) && ( dt->hour() == 0 ) ) - buf = "12"; - else - buf = TQT_TQSTRING(TQString::number( dt->hour() )).rightJustify( 2, '0', TRUE ); - } else if ( f == "m" ) { - buf = TQString::number( dt->minute() ); - } else if ( f == "mm" ) { - buf = TQT_TQSTRING(TQString::number( dt->minute() )).rightJustify( 2, '0', TRUE ); - } else if ( f == "s" ) { - buf = TQString::number( dt->second() ); - } else if ( f == "ss" ) { - buf = TQT_TQSTRING(TQString::number( dt->second() )).rightJustify( 2, '0', TRUE ); - } else if ( f == "z" ) { - buf = TQString::number( dt->msec() ); - } else if ( f == "zzz" ) { - buf = TQT_TQSTRING(TQString::number( dt->msec() )).rightJustify( 3, '0', TRUE ); - } else if ( f == "ap" ) { - buf = dt->hour() < 12 ? "am" : "pm"; - } else if ( f == "AP" ) { - buf = dt->hour() < 12 ? "AM" : "PM"; - } - } - - if ( dd ) { - if ( f == "d" ) { - buf = TQString::number( dd->day() ); - } else if ( f == "dd" ) { - buf = TQT_TQSTRING(TQString::number( dd->day() )).rightJustify( 2, '0', TRUE ); - } else if ( f == "M" ) { - buf = TQString::number( dd->month() ); - } else if ( f == "MM" ) { - buf = TQT_TQSTRING(TQString::number( dd->month() )).rightJustify( 2, '0', TRUE ); -#ifndef TQT_NO_TEXTDATE - } else if ( f == "ddd" ) { - buf = dd->shortDayName( dd->dayOfWeek() ); - } else if ( f == "dddd" ) { - buf = dd->longDayName( dd->dayOfWeek() ); - } else if ( f == "MMM" ) { - buf = dd->shortMonthName( dd->month() ); - } else if ( f == "MMMM" ) { - buf = dd->longMonthName( dd->month() ); -#endif - } else if ( f == "yy" ) { - buf = TQString::number( dd->year() ).right( 2 ); - } else if ( f == "yyyy" ) { - buf = TQString::number( dd->year() ); - } - } - - return buf; -} - -// Parses the format string and uses getFmtString to get the values for the tokens. Ret -static TQString fmtDateTime( const TQString& f, const TQTime* dt = 0, const TQDate* dd = 0 ) -{ - if ( f.isEmpty() ) { - return TQString::null; - } - - if ( dt && !dt->isValid() ) - return TQString::null; - if ( dd && !dd->isValid() ) - return TQString::null; - - bool ap = ( f.contains( "AP" ) || f.contains( "ap" ) ); - - TQString buf; - TQString frm; - TQChar status = '0'; - - for ( int i = 0; i < (int)f.length(); ++i ) { - - if ( f[ i ] == status ) { - if ( ( ap ) && ( ( f[ i ] == 'P' ) || ( f[ i ] == 'p' ) ) ) - status = '0'; - frm += f[ i ]; - } else { - buf += getFmtString( frm, dt, dd, ap ); - frm = TQString::null; - if ( ( f[ i ] == 'h' ) || ( f[ i ] == 'm' ) || ( f[ i ] == 's' ) || ( f[ i ] == 'z' ) ) { - status = f[ i ]; - frm += f[ i ]; - } else if ( ( f[ i ] == 'd' ) || ( f[ i ] == 'M' ) || ( f[ i ] == 'y' ) ) { - status = f[ i ]; - frm += f[ i ]; - } else if ( ( ap ) && ( f[ i ] == 'A' ) ) { - status = 'P'; - frm += f[ i ]; - } else if( ( ap ) && ( f[ i ] == 'a' ) ) { - status = 'p'; - frm += f[ i ]; - } else { - buf += f[ i ]; - status = '0'; - } - } - } - - buf += getFmtString( frm, dt, dd, ap ); - - return buf; -} -#endif // TQT_NO_DATESTRING - -/***************************************************************************** - TQDate member functions - *****************************************************************************/ - -/*! - \class TQDate tqdatetime.h - \reentrant - \brief The TQDate class provides date functions. - - \ingroup time - \mainclass - - A TQDate object contains a calendar date, i.e. year, month, and day - numbers, in the modern Western (Gregorian) calendar. It can read - the current date from the system clock. It provides functions for - comparing dates and for manipulating dates, e.g. by adding a - number of days or months or years. - - A TQDate object is typically created either by giving the year, - month and day numbers explicitly, or by using the static function - tqcurrentDate(), which creates a TQDate object containing the system - clock's date. An explicit date can also be set using setYMD(). The - fromString() function returns a TQDate given a string and a date - format which is used to interpret the date within the string. - - The year(), month(), and day() functions provide access to the - year, month, and day numbers. Also, dayOfWeek() and dayOfYear() - functions are provided. The same information is provided in - textual format by the toString(), shortDayName(), longDayName(), - shortMonthName() and longMonthName() functions. - - TQDate provides a full set of operators to compare two TQDate - objects where smaller means earlier and larger means later. - - You can increment (or decrement) a date by a given number of days - using addDays(). Similarly you can use addMonths() and addYears(). - The daysTo() function returns the number of days between two - dates. - - The daysInMonth() and daysInYear() functions return how many days - there are in this date's month and year, respectively. The - leapYear() function indicates whether this date is in a leap year. - - Note that TQDate should not be used for date calculations for dates - prior to the introduction of the Gregorian calendar. This calendar - was adopted by England from the 14<sup><small>th</small></sup> - September 1752 (hence this is the earliest valid TQDate), and - subsequently by most other Western countries, until 1923. - - The end of time is reached around the year 8000, by which time we - expect TQt to be obsolete. - - \sa TQTime TQDateTime TQDateEdit TQDateTimeEdit -*/ - -/*! - \enum TQt::DateFormat - - \value TextDate (default) TQt format - \value ISODate ISO 8601 extended format (YYYY-MM-DD, or with time, - YYYY-MM-DDTHH:MM:SS) - \value LocalDate locale dependent format -*/ - - -/*! - \enum TQt::TimeSpec - - \value LocalTime Locale dependent time (Timezones and Daylight Savings Time) - \value UTC Coordinated Universal Time, replaces Greenwich Time -*/ - -/*! - \fn TQDate::TQDate() - - Constructs a null date. Null dates are invalid. - - \sa isNull(), isValid() -*/ - - -/*! - Constructs a date with year \a y, month \a m and day \a d. - - \a y must be in the range 1752..8000, \a m must be in the range - 1..12, and \a d must be in the range 1..31. - - \warning If \a y is in the range 0..99, it is interpreted as - 1900..1999. - - \sa isValid() -*/ - -TQDate::TQDate( int y, int m, int d ) -{ - jd = 0; - setYMD( y, m, d ); -} - - -/*! - \fn bool TQDate::isNull() const - - Returns TRUE if the date is null; otherwise returns FALSE. A null - date is invalid. - - \sa isValid() -*/ - - -/*! - Returns TRUE if this date is valid; otherwise returns FALSE. - - \sa isNull() -*/ - -bool TQDate::isValid() const -{ - return jd >= FIRST_DAY; -} - - -/*! - Returns the year (1752..8000) of this date. - - \sa month(), day() -*/ - -int TQDate::year() const -{ - int y, m, d; - julianToGregorian( jd, y, m, d ); - return y; -} - -/*! - Returns the month (January=1..December=12) of this date. - - \sa year(), day() -*/ - -int TQDate::month() const -{ - int y, m, d; - julianToGregorian( jd, y, m, d ); - return m; -} - -/*! - Returns the day of the month (1..31) of this date. - - \sa year(), month(), dayOfWeek() -*/ - -int TQDate::day() const -{ - int y, m, d; - julianToGregorian( jd, y, m, d ); - return d; -} - -/*! - Returns the weekday (Monday=1..Sunday=7) for this date. - - \sa day(), dayOfYear() -*/ - -int TQDate::dayOfWeek() const -{ - return ( jd % 7 ) + 1; -} - -/*! - Returns the day of the year (1..365) for this date. - - \sa day(), dayOfWeek() -*/ - -int TQDate::dayOfYear() const -{ - return jd - gregorianToJulian(year(), 1, 1) + 1; -} - -/*! - Returns the number of days in the month (28..31) for this date. - - \sa day(), daysInYear() -*/ - -int TQDate::daysInMonth() const -{ - int y, m, d; - julianToGregorian( jd, y, m, d ); - if ( m == 2 && leapYear(y) ) - return 29; - else - return monthDays[m]; -} - -/*! - Returns the number of days in the year (365 or 366) for this date. - - \sa day(), daysInMonth() -*/ - -int TQDate::daysInYear() const -{ - int y, m, d; - julianToGregorian( jd, y, m, d ); - return leapYear( y ) ? 366 : 365; -} - -/*! - Returns the week number (1 to 53), and stores the year in \a - *yearNumber unless \a yearNumber is null (the default). - - Returns 0 if the date is invalid. - - In accordance with ISO 8601, weeks start on Monday and the first - Thursday of a year is always in week 1 of that year. Most years - have 52 weeks, but some have 53. - - \a *yearNumber is not always the same as year(). For example, 1 - January 2000 has week number 52 in the year 1999, and 31 December - 2002 has week number 1 in the year 2003. - - \legalese - - Copyright (c) 1989 The Regents of the University of California. - All rights reserved. - - Redistribution and use in source and binary forms are permitted - provided that the above copyright notice and this paragraph are - duplicated in all such forms and that any documentation, - advertising materials, and other materials related to such - distribution and use acknowledge that the software was developed - by the University of California, Berkeley. The name of the - University may not be used to endorse or promote products derived - from this software without specific prior written permission. - THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - - \sa isValid() -*/ - -int TQDate::weekNumber( int *yearNumber ) const -{ - if ( !isValid() ) - return 0; - - int year = TQDate::year(); - int yday = dayOfYear() - 1; - int wday = dayOfWeek(); - if (wday == 7) - wday = 0; - int w; - - for (;;) { - int len; - int bot; - int top; - - len = leapYear(year) ? 366 : 365; - /* - ** What yday (-3 ... 3) does - ** the ISO year begin on? - */ - bot = ((yday + 11 - wday) % 7) - 3; - /* - ** What yday does the NEXT - ** ISO year begin on? - */ - top = bot - (len % 7); - if (top < -3) - top += 7; - top += len; - if (yday >= top) { - ++year; - w = 1; - break; - } - if (yday >= bot) { - w = 1 + ((yday - bot) / 7); - break; - } - --year; - yday += leapYear(year) ? 366 : 365; - } - if (yearNumber != 0) - *yearNumber = year; - return w; -} - -/*! - \fn TQString TQDate::monthName( int month ) - \obsolete - - Use shortMonthName() instead. -*/ -#ifndef TQT_NO_TEXTDATE -/*! - Returns the name of the \a month. - - 1 = "Jan", 2 = "Feb", ... 12 = "Dec" - - The month names will be localized according to the system's locale - settings. - - \sa toString(), longMonthName(), shortDayName(), longDayName() -*/ - -TQString TQDate::shortMonthName( int month ) -{ -#if defined(TQT_CHECK_RANGE) - if ( month < 1 || month > 12 ) { - qWarning( "TQDate::shortMonthName: Parameter out ouf range" ); - month = 1; - } -#endif -#ifndef TQ_WS_WIN - char buffer[255]; - tm tt; - memset( &tt, 0, sizeof( tm ) ); - tt.tm_mon = month - 1; - if ( strftime( buffer, sizeof( buffer ), "%b", &tt ) ) - return TQString::fromLocal8Bit( buffer ); -#else - SYSTEMTIME st; - memset( &st, 0, sizeof(SYSTEMTIME) ); - st.wYear = 2000; - st.wMonth = month; - st.wDay = 1; - const wchar_t mmm_t[] = L"MMM"; // workaround for Borland - TQT_WA( { - TCHAR buf[255]; - if ( GetDateFormat( LOCALE_USER_DEFAULT, 0, &st, mmm_t, buf, 255 ) ) - return TQString::fromUcs2( (ushort*)buf ); - } , { - char buf[255]; - if ( GetDateFormatA( LOCALE_USER_DEFAULT, 0, &st, "MMM", (char*)&buf, 255 ) ) - return TQString::fromLocal8Bit( buf ); - } ); -#endif - return TQString::null; -} - -/*! - Returns the long name of the \a month. - - 1 = "January", 2 = "February", ... 12 = "December" - - The month names will be localized according to the system's locale - settings. - - \sa toString(), shortMonthName(), shortDayName(), longDayName() -*/ - -TQString TQDate::longMonthName( int month ) -{ -#if defined(TQT_CHECK_RANGE) - if ( month < 1 || month > 12 ) { - qWarning( "TQDate::longMonthName: Parameter out ouf range" ); - month = 1; - } -#endif -#ifndef TQ_WS_WIN - char buffer[255]; - tm tt; - memset( &tt, 0, sizeof( tm ) ); - tt.tm_mon = month - 1; - if ( strftime( buffer, sizeof( buffer ), "%B", &tt ) ) - return TQString::fromLocal8Bit( buffer ); -#else - SYSTEMTIME st; - memset( &st, 0, sizeof(SYSTEMTIME) ); - st.wYear = 2000; - st.wMonth = month; - st.wDay = 1 ; - const wchar_t mmmm_t[] = L"MMMM"; // workaround for Borland - TQT_WA( { - TCHAR buf[255]; - if ( GetDateFormat( LOCALE_USER_DEFAULT, 0, &st, mmmm_t, buf, 255 ) ) - return TQString::fromUcs2( (ushort*)buf ); - } , { - char buf[255]; - if ( GetDateFormatA( LOCALE_USER_DEFAULT, 0, &st, "MMMM", (char*)&buf, 255 ) ) - return TQString::fromLocal8Bit( buf ); - } ) -#endif - - return TQString::null; -} - -/*! - \fn TQString TQDate::dayName( int weekday ) - \obsolete - - Use shortDayName() instead. -*/ - -/*! - Returns the name of the \a weekday. - - 1 = "Mon", 2 = "Tue", ... 7 = "Sun" - - The day names will be localized according to the system's locale - settings. - - \sa toString(), shortMonthName(), longMonthName(), longDayName() -*/ - -TQString TQDate::shortDayName( int weekday ) -{ -#if defined(TQT_CHECK_RANGE) - if ( weekday < 1 || weekday > 7 ) { - qWarning( "TQDate::shortDayName: Parameter out of range" ); - weekday = 1; - } -#endif -#ifndef TQ_WS_WIN - char buffer[255]; - tm tt; - memset( &tt, 0, sizeof( tm ) ); - tt.tm_wday = ( weekday == 7 ) ? 0 : weekday; - if ( strftime( buffer, sizeof( buffer ), "%a", &tt ) ) - return TQString::fromLocal8Bit( buffer ); -#else - SYSTEMTIME st; - memset( &st, 0, sizeof(SYSTEMTIME) ); - st.wYear = 2001; - st.wMonth = 10; - st.wDayOfWeek = ( weekday == 7 ) ? 0 : weekday; - st.wDay = 21 + st.wDayOfWeek; - const wchar_t ddd_t[] = L"ddd"; // workaround for Borland - TQT_WA( { - TCHAR buf[255]; - if ( GetDateFormat( LOCALE_USER_DEFAULT, 0, &st, ddd_t, buf, 255 ) ) - return TQString::fromUcs2( (ushort*)buf ); - } , { - char buf[255]; - if ( GetDateFormatA( LOCALE_USER_DEFAULT, 0, &st, "ddd", (char*)&buf, 255 ) ) - return TQString::fromLocal8Bit( buf ); - } ); -#endif - - return TQString::null; -} - -/*! - Returns the long name of the \a weekday. - - 1 = "Monday", 2 = "Tuesday", ... 7 = "Sunday" - - The day names will be localized according to the system's locale - settings. - - \sa toString(), shortDayName(), shortMonthName(), longMonthName() -*/ - -TQString TQDate::longDayName( int weekday ) -{ -#if defined(TQT_CHECK_RANGE) - if ( weekday < 1 || weekday > 7 ) { - qWarning( "TQDate::longDayName: Parameter out of range" ); - weekday = 1; - } -#endif -#ifndef TQ_WS_WIN - char buffer[255]; - tm tt; - memset( &tt, 0, sizeof( tm ) ); - tt.tm_wday = ( weekday == 7 ) ? 0 : weekday; - if ( strftime( buffer, sizeof( buffer ), "%A", &tt ) ) - return TQString::fromLocal8Bit( buffer ); -#else - SYSTEMTIME st; - memset( &st, 0, sizeof(SYSTEMTIME) ); - st.wYear = 2001; - st.wMonth = 10; - st.wDayOfWeek = ( weekday == 7 ) ? 0 : weekday; - st.wDay = 21 + st.wDayOfWeek; - const wchar_t dddd_t[] = L"dddd"; // workaround for Borland - TQT_WA( { - TCHAR buf[255]; - if ( GetDateFormat( LOCALE_USER_DEFAULT, 0, &st, dddd_t, buf, 255 ) ) - return TQString::fromUcs2( (ushort*)buf ); - } , { - char buf[255]; - if ( GetDateFormatA( LOCALE_USER_DEFAULT, 0, &st, "dddd", (char*)&buf, 255 ) ) - return TQString::fromLocal8Bit( buf ); - } ); -#endif - - return TQString::null; -} -#endif //TQT_NO_TEXTDATE - -#ifndef TQT_NO_DATESTRING - -#if !defined(TQT_NO_SPRINTF) -/*! - \overload - - Returns the date as a string. The \a f parameter determines the - format of the string. - - If \a f is \c TQt::TextDate, the string format is "Sat May 20 1995" - (using the shortDayName() and shortMonthName() functions to - generate the string, so the day and month names are locale - specific). - - If \a f is \c TQt::ISODate, the string format corresponds to the - ISO 8601 specification for representations of dates, which is - YYYY-MM-DD where YYYY is the year, MM is the month of the year - (between 01 and 12), and DD is the day of the month between 01 and - 31. - - If \a f is \c TQt::LocalDate, the string format depends on the - locale settings of the system. - - If the date is an invalid date, then TQString::null will be returned. - - \sa shortDayName(), shortMonthName() -*/ -TQString TQDate::toString( TQt::DateFormat f ) const -{ - if ( !isValid() ) - return TQString::null; - int y, m, d; - julianToGregorian( jd, y, m, d ); - switch ( f ) { - case TQt::LocalDate: - { -#ifndef TQ_WS_WIN - tm tt; - memset( &tt, 0, sizeof( tm ) ); - char buf[255]; - tt.tm_mday = day(); - tt.tm_mon = month() - 1; - tt.tm_year = year() - 1900; - - static const char * avoidEgcsWarning = "%x"; - if ( strftime( buf, sizeof(buf), avoidEgcsWarning, &tt ) ) - return TQString::fromLocal8Bit( buf ); -#else - SYSTEMTIME st; - memset( &st, 0, sizeof(SYSTEMTIME) ); - st.wYear = year(); - st.wMonth = month(); - st.wDay = day(); - TQT_WA( { - TCHAR buf[255]; - if ( GetDateFormat( LOCALE_USER_DEFAULT, 0, &st, 0, buf, 255 ) ) - return TQString::fromUcs2( (ushort*)buf ); - } , { - char buf[255]; - if ( GetDateFormatA( LOCALE_USER_DEFAULT, 0, &st, 0, (char*)&buf, 255 ) ) - return TQString::fromLocal8Bit( buf ); - } ); -#endif - return TQString::null; - } - default: -#ifndef TQT_NO_TEXTDATE - case TQt::TextDate: - { - TQString buf = shortDayName( dayOfWeek() ); - buf += ' '; - buf += shortMonthName( m ); - TQString t; - t.sprintf( " %d %d", d, y ); - buf += t; - return buf; - } -#endif - case TQt::ISODate: - { - TQString month( TQT_TQSTRING(TQString::number( m )).rightJustify( 2, '0' ) ); - TQString day( TQT_TQSTRING(TQString::number( d )).rightJustify( 2, '0' ) ); - return TQString::number( y ) + "-" + month + "-" + day; - } - } -} -#endif //TQT_NO_SPRINTF - -/*! - Returns the date as a string. The \a format parameter determines - the format of the result string. - - These expressions may be used: - - \table - \header \i Expression \i Output - \row \i d \i the day as number without a leading zero (1-31) - \row \i dd \i the day as number with a leading zero (01-31) - \row \i ddd - \i the abbreviated localized day name (e.g. 'Mon'..'Sun'). - Uses TQDate::shortDayName(). - \row \i dddd - \i the long localized day name (e.g. 'Monday'..'Sunday'). - Uses TQDate::longDayName(). - \row \i M \i the month as number without a leading zero (1-12) - \row \i MM \i the month as number with a leading zero (01-12) - \row \i MMM - \i the abbreviated localized month name (e.g. 'Jan'..'Dec'). - Uses TQDate::shortMonthName(). - \row \i MMMM - \i the long localized month name (e.g. 'January'..'December'). - Uses TQDate::longMonthName(). - \row \i yy \i the year as two digit number (00-99) - \row \i yyyy \i the year as four digit number (1752-8000) - \endtable - - All other input characters will be ignored. - - Example format strings (assuming that the TQDate is the - 20<sup><small>th</small></sup> July 1969): - \table - \header \i Format \i Result - \row \i dd.MM.yyyy \i11 20.07.1969 - \row \i ddd MMMM d yy \i11 Sun July 20 69 - \endtable - - If the date is an invalid date, then TQString::null will be returned. - - \sa TQDateTime::toString() TQTime::toString() - -*/ -TQString TQDate::toString( const TQString& format ) const -{ - return fmtDateTime( format, 0, this ); -} -#endif //TQT_NO_DATESTRING - -/*! - Sets the date's year \a y, month \a m and day \a d. - - \a y must be in the range 1752..8000, \a m must be in the range - 1..12, and \a d must be in the range 1..31. - - \warning If \a y is in the range 0..99, it is interpreted as - 1900..1999. - - Returns TRUE if the date is valid; otherwise returns FALSE. -*/ - -bool TQDate::setYMD( int y, int m, int d ) -{ - if ( year() == y && month() == m && day() == d ) - return isValid(); - if ( !isValid(y,m,d) ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQDate::setYMD: Invalid date %04d-%02d-%02d", y, m, d ); -#endif - return FALSE; - } - jd = gregorianToJulian( y, m, d ); - return TRUE; -} - -/*! - Returns a TQDate object containing a date \a ndays later than the - date of this object (or earlier if \a ndays is negative). - - \sa addMonths() addYears() daysTo() -*/ - -TQDate TQDate::addDays( int ndays ) const -{ - TQDate d; - d.jd = jd + ndays; - return d; -} - -/*! - Returns a TQDate object containing a date \a nmonths later than the - date of this object (or earlier if \a nmonths is negative). - - \sa addDays() addYears() -*/ - -TQDate TQDate::addMonths( int nmonths ) const -{ - int y, m, d; - julianToGregorian( jd, y, m, d ); - - while ( nmonths != 0 ) { - if ( nmonths < 0 && nmonths + 12 <= 0 ) { - y--; - nmonths+=12; - } else if ( nmonths < 0 ) { - m+= nmonths; - nmonths = 0; - if ( m <= 0 ) { - --y; - m+=12; - } - } else if ( nmonths - 12 >= 0 ) { - y++; - nmonths-=12; - } else if ( m == 12 ) { - y++; - m = 0; - } else { - m+= nmonths; - nmonths = 0; - if ( m > 12 ) { - ++y; - m -= 12; - } - } - } - - TQDate tmp(y,m,1); - - if( d > tmp.daysInMonth() ) - d = tmp.daysInMonth(); - - TQDate date(y, m, d); - return date; - -} - -/*! - Returns a TQDate object containing a date \a nyears later than the - date of this object (or earlier if \a nyears is negative). - - \sa addDays(), addMonths() -*/ - -TQDate TQDate::addYears( int nyears ) const -{ - int y, m, d; - julianToGregorian( jd, y, m, d ); - y += nyears; - - TQDate tmp(y,m,1); - - if( d > tmp.daysInMonth() ) - d = tmp.daysInMonth(); - - TQDate date(y, m, d); - return date; -} - - - -/*! - Returns the number of days from this date to \a d (which is - negative if \a d is earlier than this date). - - Example: - \code - TQDate d1( 1995, 5, 17 ); // May 17th 1995 - TQDate d2( 1995, 5, 20 ); // May 20th 1995 - d1.daysTo( d2 ); // returns 3 - d2.daysTo( d1 ); // returns -3 - \endcode - - \sa addDays() -*/ - -int TQDate::daysTo( const TQDate &d ) const -{ - return d.jd - jd; -} - - -/*! - \fn bool TQDate::operator==( const TQDate &d ) const - - Returns TRUE if this date is equal to \a d; otherwise returns FALSE. -*/ - -/*! - \fn bool TQDate::operator!=( const TQDate &d ) const - - Returns TRUE if this date is different from \a d; otherwise returns FALSE. -*/ - -/*! - \fn bool TQDate::operator<( const TQDate &d ) const - - Returns TRUE if this date is earlier than \a d, otherwise returns FALSE. -*/ - -/*! - \fn bool TQDate::operator<=( const TQDate &d ) const - - Returns TRUE if this date is earlier than or equal to \a d, - otherwise returns FALSE. -*/ - -/*! - \fn bool TQDate::operator>( const TQDate &d ) const - - Returns TRUE if this date is later than \a d, otherwise returns FALSE. -*/ - -/*! - \fn bool TQDate::operator>=( const TQDate &d ) const - - Returns TRUE if this date is later than or equal to \a d, - otherwise returns FALSE. -*/ - -/*! - \overload - Returns the current date, as reported by the system clock. - - \sa TQTime::currentTime(), TQDateTime::tqcurrentDateTime() -*/ - -TQDate TQDate::tqcurrentDate() -{ - return tqcurrentDate( TQt::LocalTime ); -} - -/*! - Returns the current date, as reported by the system clock, for the - TimeSpec \a ts. The default TimeSpec is LocalTime. - - \sa TQTime::currentTime(), TQDateTime::tqcurrentDateTime(), TQt::TimeSpec -*/ -TQDate TQDate::tqcurrentDate( TQt::TimeSpec ts ) -{ - TQDate d; -#if defined(TQ_OS_WIN32) - SYSTEMTIME t; - memset( &t, 0, sizeof(SYSTEMTIME) ); - if ( ts == TQt::LocalTime ) - GetLocalTime( &t ); - else - GetSystemTime( &t ); - d.jd = gregorianToJulian( t.wYear, t.wMonth, t.wDay ); -#else - // posix compliant system - time_t ltime; - time( <ime ); - tm *t; - -# if defined(TQT_THREAD_SUPPORT) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) - // use the reentrant versions of localtime() and gmtime() where available - tm res; - if ( ts == TQt::LocalTime ) - t = localtime_r( <ime, &res ); - else - t = gmtime_r( <ime, &res ); -# else - if ( ts == TQt::LocalTime ) - t = localtime( <ime ); - else - t = gmtime( <ime ); -# endif // TQT_THREAD_SUPPORT && _POSIX_THREAD_SAFE_FUNCTIONS - - d.jd = gregorianToJulian( t->tm_year + 1900, t->tm_mon + 1, t->tm_mday ); -#endif - return d; -} - -#ifndef TQT_NO_DATESTRING -/*! - Returns the TQDate represented by the string \a s, using the format - \a f, or an invalid date if the string cannot be parsed. - - Note for \c TQt::TextDate: It is recommended that you use the - English short month names (e.g. "Jan"). Although localized month - names can also be used, they depend on the user's locale settings. - - \warning \c TQt::LocalDate cannot be used here. -*/ -TQDate TQDate::fromString( const TQString& s, TQt::DateFormat f ) -{ - if ( ( s.isEmpty() ) || ( f == TQt::LocalDate ) ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQDate::fromString: Parameter out of range" ); -#endif - TQDate d; - d.jd = 0; - return d; - } - switch ( f ) { - case TQt::ISODate: - { - int year( s.mid( 0, 4 ).toInt() ); - int month( s.mid( 5, 2 ).toInt() ); - int day( s.mid( 8, 2 ).toInt() ); - if ( year && month && day ) - return TQDate( year, month, day ); - } - break; - default: -#ifndef TQT_NO_TEXTDATE - case TQt::TextDate: - { - /* - This will fail gracefully if the input string doesn't - contain any space. - */ - int monthPos = s.find( ' ' ) + 1; - int dayPos = s.find( ' ', monthPos ) + 1; - - TQString monthName( s.mid(monthPos, dayPos - monthPos - 1) ); - int month = -1; - - // try English names first - for ( int i = 0; i < 12; i++ ) { - if ( monthName == qt_shortMonthNames[i] ) { - month = i + 1; - break; - } - } - - // try the localized names - if ( month == -1 ) { - for ( int i = 0; i < 12; i++ ) { - if ( monthName == shortMonthName( i + 1 ) ) { - month = i + 1; - break; - } - } - } -#if defined(TQT_CHECK_RANGE) - if ( month < 1 || month > 12 ) { - qWarning( "TQDate::fromString: Parameter out of range" ); - TQDate d; - d.jd = 0; - return d; - } -#endif - int day = TQT_TQSTRING(s.mid( dayPos, 2 )).stripWhiteSpace().toInt(); - int year = s.right( 4 ).toInt(); - return TQDate( year, month, day ); - } -#else - break; -#endif - } - return TQDate(); -} -#endif //TQT_NO_DATESTRING - -/*! - \overload - - Returns TRUE if the specified date (year \a y, month \a m and day - \a d) is valid; otherwise returns FALSE. - - Example: - \code - TQDate::isValid( 2002, 5, 17 ); // TRUE May 17th 2002 is valid - TQDate::isValid( 2002, 2, 30 ); // FALSE Feb 30th does not exist - TQDate::isValid( 2004, 2, 29 ); // TRUE 2004 is a leap year - TQDate::isValid( 1202, 6, 6 ); // FALSE 1202 is pre-Gregorian - \endcode - - \warning A \a y value in the range 00..99 is interpreted as - 1900..1999. - - \sa isNull(), setYMD() -*/ - -bool TQDate::isValid( int y, int m, int d ) -{ - if ( y >= 0 && y <= 99 ) - y += 1900; - else if ( y < FIRST_YEAR || (y == FIRST_YEAR && (m < 9 || - (m == 9 && d < 14))) ) - return FALSE; - return (d > 0 && m > 0 && m <= 12) && - (d <= monthDays[m] || (d == 29 && m == 2 && leapYear(y))); -} - -/*! - Returns TRUE if the specified year \a y is a leap year; otherwise - returns FALSE. -*/ - -bool TQDate::leapYear( int y ) -{ - return y % 4 == 0 && y % 100 != 0 || y % 400 == 0; -} - -/*! - \internal - Converts a Gregorian date to a Julian day. - This algorithm is taken from Communications of the ACM, Vol 6, No 8. - \sa julianToGregorian() -*/ - -uint TQDate::gregorianToJulian( int y, int m, int d ) -{ - uint c, ya; - if ( y <= 99 ) - y += 1900; - if ( m > 2 ) { - m -= 3; - } else { - m += 9; - y--; - } - c = y; // NOTE: Sym C++ 6.0 bug - c /= 100; - ya = y - 100*c; - return 1721119 + d + (146097*c)/4 + (1461*ya)/4 + (153*m+2)/5; -} - -/*! - \internal - Converts a Julian day to a Gregorian date. - This algorithm is taken from Communications of the ACM, Vol 6, No 8. - \sa gregorianToJulian() -*/ - -void TQDate::julianToGregorian( uint jd, int &y, int &m, int &d ) -{ - uint x; - uint j = jd - 1721119; - y = (j*4 - 1)/146097; - j = j*4 - 146097*y - 1; - x = j/4; - j = (x*4 + 3) / 1461; - y = 100*y + j; - x = (x*4) + 3 - 1461*j; - x = (x + 4)/4; - m = (5*x - 3)/153; - x = 5*x - 3 - 153*m; - d = (x + 5)/5; - if ( m < 10 ) { - m += 3; - } else { - m -= 9; - y++; - } -} - - -/***************************************************************************** - TQTime member functions - *****************************************************************************/ - -/*! - \class TQTime tqdatetime.h - \reentrant - - \brief The TQTime class provides clock time functions. - - \ingroup time - \mainclass - - A TQTime object contains a clock time, i.e. the number of hours, - minutes, seconds, and milliseconds since midnight. It can read the - current time from the system clock and measure a span of elapsed - time. It provides functions for comparing times and for - manipulating a time by adding a number of (milli)seconds. - - TQTime uses the 24-hour clock format; it has no concept of AM/PM. - It operates in local time; it knows nothing about time zones or - daylight savings time. - - A TQTime object is typically created either by giving the number of - hours, minutes, seconds, and milliseconds explicitly, or by using - the static function currentTime(), which creates a TQTime object - that contains the system's clock time. Note that the accuracy - depends on the accuracy of the underlying operating system; not - all systems provide 1-millisecond accuracy. - - The hour(), minute(), second(), and msec() functions provide - access to the number of hours, minutes, seconds, and milliseconds - of the time. The same information is provided in textual format by - the toString() function. - - TQTime provides a full set of operators to compare two TQTime - objects. One time is considered smaller than another if it is - earlier than the other. - - The time a given number of seconds or milliseconds later than a - given time can be found using the addSecs() or addMSecs() - functions. Correspondingly, the number of (milli)seconds between - two times can be found using the secsTo() or msecsTo() functions. - - TQTime can be used to measure a span of elapsed time using the - start(), restart(), and elapsed() functions. - - \sa TQDate, TQDateTime -*/ - -/*! - \fn TQTime::TQTime() - - Constructs the time 0 hours, minutes, seconds and milliseconds, - i.e. 00:00:00.000 (midnight). This is a valid time. - - \sa isValid() -*/ - -/*! - Constructs a time with hour \a h, minute \a m, seconds \a s and - milliseconds \a ms. - - \a h must be in the range 0..23, \a m and \a s must be in the - range 0..59, and \a ms must be in the range 0..999. - - \sa isValid() -*/ - -TQTime::TQTime( int h, int m, int s, int ms ) -{ - setHMS( h, m, s, ms ); -} - - -/*! - \fn bool TQTime::isNull() const - - Returns TRUE if the time is equal to 00:00:00.000; otherwise - returns FALSE. A null time is valid. - - \sa isValid() -*/ - -/*! - Returns TRUE if the time is valid; otherwise returns FALSE. The - time 23:30:55.746 is valid, whereas 24:12:30 is invalid. - - \sa isNull() -*/ - -bool TQTime::isValid() const -{ - return ds < MSECS_PER_DAY; -} - - -/*! - Returns the hour part (0..23) of the time. -*/ - -int TQTime::hour() const -{ - return ds / MSECS_PER_HOUR; -} - -/*! - Returns the minute part (0..59) of the time. -*/ - -int TQTime::minute() const -{ - return (ds % MSECS_PER_HOUR)/MSECS_PER_MIN; -} - -/*! - Returns the second part (0..59) of the time. -*/ - -int TQTime::second() const -{ - return (ds / 1000)%SECS_PER_MIN; -} - -/*! - Returns the millisecond part (0..999) of the time. -*/ - -int TQTime::msec() const -{ - return ds % 1000; -} - -#ifndef TQT_NO_DATESTRING -#ifndef TQT_NO_SPRINTF -/*! - \overload - - Returns the time as a string. Milliseconds are not included. The - \a f parameter determines the format of the string. - - If \a f is \c TQt::TextDate, the string format is HH:MM:SS; e.g. 1 - second before midnight would be "23:59:59". - - If \a f is \c TQt::ISODate, the string format corresponds to the - ISO 8601 extended specification for representations of dates, - which is also HH:MM:SS. - - If \a f is TQt::LocalDate, the string format depends on the locale - settings of the system. - - If the time is an invalid time, then TQString::null will be returned. -*/ - -TQString TQTime::toString( TQt::DateFormat f ) const -{ - if ( !isValid() ) - return TQString::null; - - switch ( f ) { - case TQt::LocalDate: - { -#ifndef TQ_WS_WIN - tm tt; - memset( &tt, 0, sizeof( tm ) ); - char buf[255]; - tt.tm_sec = second(); - tt.tm_min = minute(); - tt.tm_hour = hour(); - if ( strftime( buf, sizeof(buf), "%X", &tt ) ) - return TQString::fromLocal8Bit( buf ); -#else - SYSTEMTIME st; - memset( &st, 0, sizeof(SYSTEMTIME) ); - st.wHour = hour(); - st.wMinute = minute(); - st.wSecond = second(); - st.wMilliseconds = 0; - TQT_WA( { - TCHAR buf[255]; - if ( GetTimeFormat( LOCALE_USER_DEFAULT, 0, &st, 0, buf, 255 ) ) - return TQString::fromUcs2( (ushort*)buf ); - } , { - char buf[255]; - if ( GetTimeFormatA( LOCALE_USER_DEFAULT, 0, &st, 0, (char*)&buf, 255 ) ) - return TQString::fromLocal8Bit( buf ); - } ); -#endif - return TQString::null; - } - default: - case TQt::ISODate: - case TQt::TextDate: - TQString buf; - buf.sprintf( "%.2d:%.2d:%.2d", hour(), minute(), second() ); - return buf; - } -} -#endif - -/*! - Returns the time as a string. The \a format parameter determines - the format of the result string. - - These expressions may be used: - - \table - \header \i Expression \i Output - \row \i h - \i the hour without a leading zero (0..23 or 1..12 if AM/PM display) - \row \i hh - \i the hour with a leading zero (00..23 or 01..12 if AM/PM display) - \row \i m \i the minute without a leading zero (0..59) - \row \i mm \i the minute with a leading zero (00..59) - \row \i s \i the second whithout a leading zero (0..59) - \row \i ss \i the second whith a leading zero (00..59) - \row \i z \i the milliseconds without leading zeroes (0..999) - \row \i zzz \i the milliseconds with leading zeroes (000..999) - \row \i AP - \i use AM/PM display. \e AP will be replaced by either "AM" or "PM". - \row \i ap - \i use am/pm display. \e ap will be replaced by either "am" or "pm". - \endtable - - All other input characters will be ignored. - - Example format strings (assuming that the TQTime is 14:13:09.042) - - \table - \header \i Format \i Result - \row \i hh:mm:ss.zzz \i11 14:13:09.042 - \row \i h:m:s ap \i11 2:13:9 pm - \endtable - - If the time is an invalid time, then TQString::null will be returned. - - \sa TQDate::toString() TQDateTime::toString() -*/ -TQString TQTime::toString( const TQString& format ) const -{ - return fmtDateTime( format, this, 0 ); -} -#endif //TQT_NO_DATESTRING -/*! - Sets the time to hour \a h, minute \a m, seconds \a s and - milliseconds \a ms. - - \a h must be in the range 0..23, \a m and \a s must be in the - range 0..59, and \a ms must be in the range 0..999. Returns TRUE - if the set time is valid; otherwise returns FALSE. - - \sa isValid() -*/ - -bool TQTime::setHMS( int h, int m, int s, int ms ) -{ - if ( !isValid(h,m,s,ms) ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQTime::setHMS Invalid time %02d:%02d:%02d.%03d", h, m, s, - ms ); -#endif - ds = MSECS_PER_DAY; // make this invalid - return FALSE; - } - ds = (h*SECS_PER_HOUR + m*SECS_PER_MIN + s)*1000 + ms; - return TRUE; -} - -/*! - Returns a TQTime object containing a time \a nsecs seconds later - than the time of this object (or earlier if \a nsecs is negative). - - Note that the time will wrap if it passes midnight. - - Example: - \code - TQTime n( 14, 0, 0 ); // n == 14:00:00 - TQTime t; - t = n.addSecs( 70 ); // t == 14:01:10 - t = n.addSecs( -70 ); // t == 13:58:50 - t = n.addSecs( 10*60*60 + 5 ); // t == 00:00:05 - t = n.addSecs( -15*60*60 ); // t == 23:00:00 - \endcode - - \sa addMSecs(), secsTo(), TQDateTime::addSecs() -*/ - -TQTime TQTime::addSecs( int nsecs ) const -{ - return addMSecs( nsecs * 1000 ); -} - -/*! - Returns the number of seconds from this time to \a t (which is - negative if \a t is earlier than this time). - - Because TQTime measures time within a day and there are 86400 - seconds in a day, the result is always between -86400 and 86400. - - \sa addSecs() TQDateTime::secsTo() -*/ - -int TQTime::secsTo( const TQTime &t ) const -{ - return ((int)t.ds - (int)ds)/1000; -} - -/*! - Returns a TQTime object containing a time \a ms milliseconds later - than the time of this object (or earlier if \a ms is negative). - - Note that the time will wrap if it passes midnight. See addSecs() - for an example. - - \sa addSecs(), msecsTo() -*/ - -TQTime TQTime::addMSecs( int ms ) const -{ - TQTime t; - if ( ms < 0 ) { - // % not well-defined for -ve, but / is. - int negdays = (MSECS_PER_DAY-ms) / MSECS_PER_DAY; - t.ds = ((int)ds + ms + negdays*MSECS_PER_DAY) - % MSECS_PER_DAY; - } else { - t.ds = ((int)ds + ms) % MSECS_PER_DAY; - } - return t; -} - -/*! - Returns the number of milliseconds from this time to \a t (which - is negative if \a t is earlier than this time). - - Because TQTime measures time within a day and there are 86400 - seconds in a day, the result is always between -86400000 and - 86400000 msec. - - \sa secsTo() -*/ - -int TQTime::msecsTo( const TQTime &t ) const -{ - return (int)t.ds - (int)ds; -} - - -/*! - \fn bool TQTime::operator==( const TQTime &t ) const - - Returns TRUE if this time is equal to \a t; otherwise returns FALSE. -*/ - -/*! - \fn bool TQTime::operator!=( const TQTime &t ) const - - Returns TRUE if this time is different from \a t; otherwise returns FALSE. -*/ - -/*! - \fn bool TQTime::operator<( const TQTime &t ) const - - Returns TRUE if this time is earlier than \a t; otherwise returns FALSE. -*/ - -/*! - \fn bool TQTime::operator<=( const TQTime &t ) const - - Returns TRUE if this time is earlier than or equal to \a t; - otherwise returns FALSE. -*/ - -/*! - \fn bool TQTime::operator>( const TQTime &t ) const - - Returns TRUE if this time is later than \a t; otherwise returns FALSE. -*/ - -/*! - \fn bool TQTime::operator>=( const TQTime &t ) const - - Returns TRUE if this time is later than or equal to \a t; - otherwise returns FALSE. -*/ - - - -/*! - \overload - - Returns the current time as reported by the system clock. - - Note that the accuracy depends on the accuracy of the underlying - operating system; not all systems provide 1-millisecond accuracy. -*/ - -TQTime TQTime::currentTime() -{ - return currentTime( TQt::LocalTime ); -} - -/*! - Returns the current time as reported by the system clock, for the - TimeSpec \a ts. The default TimeSpec is LocalTime. - - Note that the accuracy depends on the accuracy of the underlying - operating system; not all systems provide 1-millisecond accuracy. - - \sa TQt::TimeSpec -*/ -TQTime TQTime::currentTime( TQt::TimeSpec ts ) -{ - TQTime t; - currentTime( &t, ts ); - return t; -} - -#ifndef TQT_NO_DATESTRING -/*! - Returns the representation \a s as a TQTime using the format \a f, - or an invalid time if this is not possible. - - \warning Note that \c TQt::LocalDate cannot be used here. -*/ -TQTime TQTime::fromString( const TQString& s, TQt::DateFormat f ) -{ - if ( ( s.isEmpty() ) || ( f == TQt::LocalDate ) ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQTime::fromString: Parameter out of range" ); -#endif - TQTime t; - t.ds = MSECS_PER_DAY; - return t; - } - - int hour( s.mid( 0, 2 ).toInt() ); - int minute( s.mid( 3, 2 ).toInt() ); - int second( s.mid( 6, 2 ).toInt() ); - int msec( s.mid( 9, 3 ).toInt() ); - return TQTime( hour, minute, second, msec ); -} -#endif - -/*! - \internal - \obsolete - - Fetches the current time and returns TRUE if the time is within one - minute after midnight, otherwise FALSE. The return value is used by - TQDateTime::tqcurrentDateTime() to ensure that the date there is correct. -*/ - -bool TQTime::currentTime( TQTime *ct ) -{ - return currentTime( ct, TQt::LocalTime ); -} - - -/*! - \internal - - Fetches the current time, for the TimeSpec \a ts, and returns TRUE - if the time is within one minute after midnight, otherwise FALSE. The - return value is used by TQDateTime::tqcurrentDateTime() to ensure that - the date there is correct. The default TimeSpec is LocalTime. - - \sa TQt::TimeSpec -*/ -bool TQTime::currentTime( TQTime *ct, TQt::TimeSpec ts ) -{ - if ( !ct ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQTime::currentTime(TQTime *): Null pointer not allowed" ); -#endif - return FALSE; - } - -#if defined(TQ_OS_WIN32) - SYSTEMTIME t; - if ( ts == TQt::LocalTime ) { - GetLocalTime( &t ); - } else { - GetSystemTime( &t ); - } - ct->ds = (uint)( MSECS_PER_HOUR*t.wHour + MSECS_PER_MIN*t.wMinute + - 1000*t.wSecond + t.wMilliseconds ); -#elif defined(TQ_OS_UNIX) - // posix compliant system - struct timeval tv; - gettimeofday( &tv, 0 ); - time_t ltime = tv.tv_sec; - tm *t; - -# if defined(TQT_THREAD_SUPPORT) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) - // use the reentrant versions of localtime() and gmtime() where available - tm res; - if ( ts == TQt::LocalTime ) - t = localtime_r( <ime, &res ); - else - t = gmtime_r( <ime, &res ); -# else - if ( ts == TQt::LocalTime ) - t = localtime( <ime ); - else - t = gmtime( <ime ); -# endif // TQT_THREAD_SUPPORT && _POSIX_THREAD_SAFE_FUNCTIONS - - ct->ds = (uint)( MSECS_PER_HOUR * t->tm_hour + MSECS_PER_MIN * t->tm_min + - 1000 * t->tm_sec + tv.tv_usec / 1000 ); -#else - time_t ltime; // no millisecond resolution - ::time( <ime ); - tm *t; - if ( ts == TQt::LocalTime ) - localtime( <ime ); - else - gmtime( <ime ); - ct->ds = (uint) ( MSECS_PER_HOUR * t->tm_hour + MSECS_PER_MIN * t->tm_min + - 1000 * t->tm_sec ); -#endif - // 00:00.00 to 00:00.59.999 is considered as "midnight or right after" - return ct->ds < (uint) MSECS_PER_MIN; -} - -/*! - \overload - - Returns TRUE if the specified time is valid; otherwise returns - FALSE. - - The time is valid if \a h is in the range 0..23, \a m and \a s are - in the range 0..59, and \a ms is in the range 0..999. - - Example: - \code - TQTime::isValid(21, 10, 30); // returns TRUE - TQTime::isValid(22, 5, 62); // returns FALSE - \endcode -*/ - -bool TQTime::isValid( int h, int m, int s, int ms ) -{ - return (uint)h < 24 && (uint)m < 60 && (uint)s < 60 && (uint)ms < 1000; -} - - -/*! - Sets this time to the current time. This is practical for timing: - - \code - TQTime t; - t.start(); - some_lengthy_task(); - qDebug( "Time elapsed: %d ms", t.elapsed() ); - \endcode - - \sa restart(), elapsed(), currentTime() -*/ - -void TQTime::start() -{ - *this = currentTime(); -} - -/*! - Sets this time to the current time and returns the number of - milliseconds that have elapsed since the last time start() or - restart() was called. - - This function is guaranteed to be atomic and is thus very handy - for repeated measurements. Call start() to start the first - measurement and then restart() for each later measurement. - - Note that the counter wraps to zero 24 hours after the last call - to start() or restart(). - - \warning If the system's clock setting has been changed since the - last time start() or restart() was called, the result is - undefined. This can happen when daylight savings time is turned on - or off. - - \sa start(), elapsed(), currentTime() -*/ - -int TQTime::restart() -{ - TQTime t = currentTime(); - int n = msecsTo( t ); - if ( n < 0 ) // passed midnight - n += 86400*1000; - *this = t; - return n; -} - -/*! - Returns the number of milliseconds that have elapsed since the - last time start() or restart() was called. - - Note that the counter wraps to zero 24 hours after the last call - to start() or restart. - - Note that the accuracy depends on the accuracy of the underlying - operating system; not all systems provide 1-millisecond accuracy. - - \warning If the system's clock setting has been changed since the - last time start() or restart() was called, the result is - undefined. This can happen when daylight savings time is turned on - or off. - - \sa start(), restart() -*/ - -int TQTime::elapsed() const -{ - int n = msecsTo( currentTime() ); - if ( n < 0 ) // passed midnight - n += 86400*1000; - return n; -} - - -/***************************************************************************** - TQDateTime member functions - *****************************************************************************/ - -/*! - \class TQDateTime tqdatetime.h - \reentrant - \brief The TQDateTime class provides date and time functions. - - \ingroup time - \mainclass - - A TQDateTime object contains a calendar date and a clock time (a - "datetime"). It is a combination of the TQDate and TQTime classes. - It can read the current datetime from the system clock. It - provides functions for comparing datetimes and for manipulating a - datetime by adding a number of seconds, days, months or years. - - A TQDateTime object is typically created either by giving a date - and time explicitly in the constructor, or by using the static - function tqcurrentDateTime(), which returns a TQDateTime object set - to the system clock's time. The date and time can be changed with - setDate() and setTime(). A datetime can also be set using the - setTime_t() function, which takes a POSIX-standard "number of - seconds since 00:00:00 on January 1, 1970" value. The fromString() - function returns a TQDateTime given a string and a date format - which is used to interpret the date within the string. - - The date() and time() functions provide access to the date and - time parts of the datetime. The same information is provided in - textual format by the toString() function. - - TQDateTime provides a full set of operators to compare two - TQDateTime objects where smaller means earlier and larger means - later. - - You can increment (or decrement) a datetime by a given number of - seconds using addSecs() or days using addDays(). Similarly you can - use addMonths() and addYears(). The daysTo() function returns the - number of days between two datetimes, and secsTo() returns the - number of seconds between two datetimes. - - The range of a datetime object is constrained to the ranges of the - TQDate and TQTime objects which it embodies. - - \sa TQDate TQTime TQDateTimeEdit -*/ - - -/*! - \fn TQDateTime::TQDateTime() - - Constructs a null datetime (i.e. null date and null time). A null - datetime is invalid, since the date is invalid. - - \sa isValid() -*/ - - -/*! - Constructs a datetime with date \a date and null (but valid) time - (00:00:00.000). -*/ - -TQDateTime::TQDateTime( const TQDate &date ) - : d(date) -{ -} - -/*! - Constructs a datetime with date \a date and time \a time. -*/ - -TQDateTime::TQDateTime( const TQDate &date, const TQTime &time ) - : d(date), t(time) -{ -} - - -/*! - \fn bool TQDateTime::isNull() const - - Returns TRUE if both the date and the time are null; otherwise - returns FALSE. A null datetime is invalid. - - \sa TQDate::isNull(), TQTime::isNull() -*/ - -/*! - \fn bool TQDateTime::isValid() const - - Returns TRUE if both the date and the time are valid; otherwise - returns FALSE. - - \sa TQDate::isValid(), TQTime::isValid() -*/ - -/*! - \fn TQDate TQDateTime::date() const - - Returns the date part of the datetime. - - \sa setDate(), time() -*/ - -/*! - \fn TQTime TQDateTime::time() const - - Returns the time part of the datetime. - - \sa setTime(), date() -*/ - -/*! - \fn void TQDateTime::setDate( const TQDate &date ) - - Sets the date part of this datetime to \a date. - - \sa date(), setTime() -*/ - -/*! - \fn void TQDateTime::setTime( const TQTime &time ) - - Sets the time part of this datetime to \a time. - - \sa time(), setDate() -*/ - - -/*! - Returns the datetime as the number of seconds that have passed - since 1970-01-01T00:00:00, Coordinated Universal Time (UTC). - - On systems that do not support timezones, this function will - behave as if local time were UTC. - - \sa setTime_t() -*/ - -uint TQDateTime::toTime_t() const -{ - tm brokenDown; - brokenDown.tm_sec = t.second(); - brokenDown.tm_min = t.minute(); - brokenDown.tm_hour = t.hour(); - brokenDown.tm_mday = d.day(); - brokenDown.tm_mon = d.month() - 1; - brokenDown.tm_year = d.year() - 1900; - brokenDown.tm_isdst = -1; - int secsSince1Jan1970UTC = (int) mktime( &brokenDown ); - if ( secsSince1Jan1970UTC < -1 ) - secsSince1Jan1970UTC = -1; - return (uint) secsSince1Jan1970UTC; -} - -/*! - \overload - - Convenience function that sets the date and time to local time - based on the given UTC time. -*/ - -void TQDateTime::setTime_t( uint secsSince1Jan1970UTC ) -{ - setTime_t( secsSince1Jan1970UTC, TQt::LocalTime ); -} - -/*! - Sets the date and time to \a ts time (\c TQt::LocalTime or \c - TQt::UTC) given the number of seconds that have passed since - 1970-01-01T00:00:00, Coordinated Universal Time (UTC). On systems - that do not support timezones this function will behave as if - local time were UTC. - - On Windows, only a subset of \a secsSince1Jan1970UTC values are - supported, as Windows starts counting from 1980. - - \sa toTime_t() -*/ -void TQDateTime::setTime_t( uint secsSince1Jan1970UTC, TQt::TimeSpec ts ) -{ - time_t tmp = (time_t) secsSince1Jan1970UTC; - tm *brokenDown = 0; - -#if defined(TQ_OS_UNIX) && defined(TQT_THREAD_SUPPORT) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) - // posix compliant system - // use the reentrant versions of localtime() and gmtime() where available - tm res; - if ( ts == TQt::LocalTime ) - brokenDown = localtime_r( &tmp, &res ); - if ( !brokenDown ) { - brokenDown = gmtime_r( &tmp, &res ); - if ( !brokenDown ) { - d.jd = TQDate::gregorianToJulian( 1970, 1, 1 ); - t.ds = 0; - return; - } - } -#else - if ( ts == TQt::LocalTime ) - brokenDown = localtime( &tmp ); - if ( !brokenDown ) { - brokenDown = gmtime( &tmp ); - if ( !brokenDown ) { - d.jd = TQDate::gregorianToJulian( 1970, 1, 1 ); - t.ds = 0; - return; - } - } -#endif - - d.jd = TQDate::gregorianToJulian( brokenDown->tm_year + 1900, - brokenDown->tm_mon + 1, - brokenDown->tm_mday ); - t.ds = MSECS_PER_HOUR * brokenDown->tm_hour + - MSECS_PER_MIN * brokenDown->tm_min + - 1000 * brokenDown->tm_sec; -} -#ifndef TQT_NO_DATESTRING -#ifndef TQT_NO_SPRINTF -/*! - \overload - - Returns the datetime as a string. The \a f parameter determines - the format of the string. - - If \a f is \c TQt::TextDate, the string format is "Wed May 20 - 03:40:13 1998" (using TQDate::shortDayName(), TQDate::shortMonthName(), - and TQTime::toString() to generate the string, so the day and month - names will have localized names). - - If \a f is \c TQt::ISODate, the string format corresponds to the - ISO 8601 extended specification for representations of dates and - times, which is YYYY-MM-DDTHH:MM:SS. - - If \a f is \c TQt::LocalDate, the string format depends on the - locale settings of the system. - - If the format \a f is invalid or the datetime is invalid, toString() - returns a null string. - - \sa TQDate::toString() TQTime::toString() -*/ - -TQString TQDateTime::toString( TQt::DateFormat f ) const -{ - if ( !isValid() ) - return TQString::null; - - if ( f == TQt::ISODate ) { - return d.toString( TQt::ISODate ) + "T" + t.toString( TQt::ISODate ); - } -#ifndef TQT_NO_TEXTDATE - else if ( f == TQt::TextDate ) { -#ifndef TQ_WS_WIN - TQString buf = d.shortDayName( d.dayOfWeek() ); - buf += ' '; - buf += d.shortMonthName( d.month() ); - buf += ' '; - buf += TQString().setNum( d.day() ); - buf += ' '; -#else - TQString buf; - TQString winstr; - TQT_WA( { - TCHAR out[255]; - GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_ILDATE, out, 255 ); - winstr = TQString::fromUcs2( (ushort*)out ); - } , { - char out[255]; - GetLocaleInfoA( LOCALE_USER_DEFAULT, LOCALE_ILDATE, (char*)&out, 255 ); - winstr = TQString::fromLocal8Bit( out ); - } ); - switch ( winstr.toInt() ) { - case 1: - buf = d.shortDayName( d.dayOfWeek() ) + " " + TQString().setNum( d.day() ) + ". " + d.shortMonthName( d.month() ) + " "; - break; - default: - buf = d.shortDayName( d.dayOfWeek() ) + " " + d.shortMonthName( d.month() ) + " " + TQString().setNum( d.day() ) + " "; - break; - } -#endif - buf += t.toString(); - buf += ' '; - buf += TQString().setNum( d.year() ); - return buf; - } -#endif - else if ( f == TQt::LocalDate ) { - return d.toString( TQt::LocalDate ) + " " + t.toString( TQt::LocalDate ); - } - return TQString::null; -} -#endif - -/*! - Returns the datetime as a string. The \a format parameter - determines the format of the result string. - - These expressions may be used for the date: - - \table - \header \i Expression \i Output - \row \i d \i the day as number without a leading zero (1-31) - \row \i dd \i the day as number with a leading zero (01-31) - \row \i ddd - \i the abbreviated localized day name (e.g. 'Mon'..'Sun'). - Uses TQDate::shortDayName(). - \row \i dddd - \i the long localized day name (e.g. 'Monday'..'Sunday'). - Uses TQDate::longDayName(). - \row \i M \i the month as number without a leading zero (1-12) - \row \i MM \i the month as number with a leading zero (01-12) - \row \i MMM - \i the abbreviated localized month name (e.g. 'Jan'..'Dec'). - Uses TQDate::shortMonthName(). - \row \i MMMM - \i the long localized month name (e.g. 'January'..'December'). - Uses TQDate::longMonthName(). - \row \i yy \i the year as two digit number (00-99) - \row \i yyyy \i the year as four digit number (1752-8000) - \endtable - - These expressions may be used for the time: - - \table - \header \i Expression \i Output - \row \i h - \i the hour without a leading zero (0..23 or 1..12 if AM/PM display) - \row \i hh - \i the hour with a leading zero (00..23 or 01..12 if AM/PM display) - \row \i m \i the minute without a leading zero (0..59) - \row \i mm \i the minute with a leading zero (00..59) - \row \i s \i the second whithout a leading zero (0..59) - \row \i ss \i the second whith a leading zero (00..59) - \row \i z \i the milliseconds without leading zeroes (0..999) - \row \i zzz \i the milliseconds with leading zeroes (000..999) - \row \i AP - \i use AM/PM display. \e AP will be replaced by either "AM" or "PM". - \row \i ap - \i use am/pm display. \e ap will be replaced by either "am" or "pm". - \endtable - - All other input characters will be ignored. - - Example format strings (assumed that the TQDateTime is - 21<small><sup>st</sup></small> May 2001 14:13:09) - - \table - \header \i Format \i Result - \row \i dd.MM.yyyy \i11 21.05.2001 - \row \i ddd MMMM d yy \i11 Tue May 21 01 - \row \i hh:mm:ss.zzz \i11 14:13:09.042 - \row \i h:m:s ap \i11 2:13:9 pm - \endtable - - If the datetime is an invalid datetime, then TQString::null will be returned. - - \sa TQDate::toString() TQTime::toString() -*/ -TQString TQDateTime::toString( const TQString& format ) const -{ - return fmtDateTime( format, &t, &d ); -} -#endif //TQT_NO_DATESTRING - -/*! - Returns a TQDateTime object containing a datetime \a ndays days - later than the datetime of this object (or earlier if \a ndays is - negative). - - \sa daysTo(), addMonths(), addYears(), addSecs() -*/ - -TQDateTime TQDateTime::addDays( int ndays ) const -{ - return TQDateTime( d.addDays(ndays), t ); -} - -/*! - Returns a TQDateTime object containing a datetime \a nmonths months - later than the datetime of this object (or earlier if \a nmonths - is negative). - - \sa daysTo(), addDays(), addYears(), addSecs() -*/ - -TQDateTime TQDateTime::addMonths( int nmonths ) const -{ - return TQDateTime( d.addMonths(nmonths), t ); -} - -/*! - Returns a TQDateTime object containing a datetime \a nyears years - later than the datetime of this object (or earlier if \a nyears is - negative). - - \sa daysTo(), addDays(), addMonths(), addSecs() -*/ - -TQDateTime TQDateTime::addYears( int nyears ) const -{ - return TQDateTime( d.addYears(nyears), t ); -} - -/*! - Returns a TQDateTime object containing a datetime \a nsecs seconds - later than the datetime of this object (or earlier if \a nsecs is - negative). - - \sa secsTo(), addDays(), addMonths(), addYears() -*/ - -TQDateTime TQDateTime::addSecs( int nsecs ) const -{ - uint dd = d.jd; - int tt = t.ds; - int sign = 1; - if ( nsecs < 0 ) { - nsecs = -nsecs; - sign = -1; - } - if ( nsecs >= (int)SECS_PER_DAY ) { - dd += sign*(nsecs/SECS_PER_DAY); - nsecs %= SECS_PER_DAY; - } - tt += sign*nsecs*1000; - if ( tt < 0 ) { - tt = MSECS_PER_DAY - tt - 1; - dd -= tt / MSECS_PER_DAY; - tt = tt % MSECS_PER_DAY; - tt = MSECS_PER_DAY - tt - 1; - } else if ( tt >= (int)MSECS_PER_DAY ) { - dd += ( tt / MSECS_PER_DAY ); - tt = tt % MSECS_PER_DAY; - } - TQDateTime ret; - ret.t.ds = tt; - ret.d.jd = dd; - return ret; -} - -/*! - Returns the number of days from this datetime to \a dt (which is - negative if \a dt is earlier than this datetime). - - \sa addDays(), secsTo() -*/ - -int TQDateTime::daysTo( const TQDateTime &dt ) const -{ - return d.daysTo( dt.d ); -} - -/*! - Returns the number of seconds from this datetime to \a dt (which - is negative if \a dt is earlier than this datetime). - - Example: - \code - TQDateTime dt = TQDateTime::tqcurrentDateTime(); - TQDateTime xmas( TQDate(dt.date().year(),12,24), TQTime(17,00) ); - qDebug( "There are %d seconds to Christmas", dt.secsTo(xmas) ); - \endcode - - \sa addSecs(), daysTo(), TQTime::secsTo() -*/ - -int TQDateTime::secsTo( const TQDateTime &dt ) const -{ - return t.secsTo(dt.t) + d.daysTo(dt.d)*SECS_PER_DAY; -} - - -/*! - Returns TRUE if this datetime is equal to \a dt; otherwise returns FALSE. - - \sa operator!=() -*/ - -bool TQDateTime::operator==( const TQDateTime &dt ) const -{ - return t == dt.t && d == dt.d; -} - -/*! - Returns TRUE if this datetime is different from \a dt; otherwise - returns FALSE. - - \sa operator==() -*/ - -bool TQDateTime::operator!=( const TQDateTime &dt ) const -{ - return t != dt.t || d != dt.d; -} - -/*! - Returns TRUE if this datetime is earlier than \a dt; otherwise - returns FALSE. -*/ - -bool TQDateTime::operator<( const TQDateTime &dt ) const -{ - if ( d < dt.d ) - return TRUE; - return d == dt.d ? t < dt.t : FALSE; -} - -/*! - Returns TRUE if this datetime is earlier than or equal to \a dt; - otherwise returns FALSE. -*/ - -bool TQDateTime::operator<=( const TQDateTime &dt ) const -{ - if ( d < dt.d ) - return TRUE; - return d == dt.d ? t <= dt.t : FALSE; -} - -/*! - Returns TRUE if this datetime is later than \a dt; otherwise - returns FALSE. -*/ - -bool TQDateTime::operator>( const TQDateTime &dt ) const -{ - if ( d > dt.d ) - return TRUE; - return d == dt.d ? t > dt.t : FALSE; -} - -/*! - Returns TRUE if this datetime is later than or equal to \a dt; - otherwise returns FALSE. -*/ - -bool TQDateTime::operator>=( const TQDateTime &dt ) const -{ - if ( d > dt.d ) - return TRUE; - return d == dt.d ? t >= dt.t : FALSE; -} - -/*! - \overload - - Returns the current datetime, as reported by the system clock. - - \sa TQDate::tqcurrentDate(), TQTime::currentTime() -*/ - -TQDateTime TQDateTime::tqcurrentDateTime() -{ - return tqcurrentDateTime( TQt::LocalTime ); -} - -/*! - Returns the current datetime, as reported by the system clock, for the - TimeSpec \a ts. The default TimeSpec is LocalTime. - - \sa TQDate::tqcurrentDate(), TQTime::currentTime(), TQt::TimeSpec -*/ - -TQDateTime TQDateTime::tqcurrentDateTime( TQt::TimeSpec ts ) -{ - TQDateTime dt; - TQTime t; - dt.setDate( TQDate::tqcurrentDate(ts) ); - if ( TQTime::currentTime(&t, ts) ) // midnight or right after? - dt.setDate( TQDate::tqcurrentDate(ts) ); // fetch date again - dt.setTime( t ); - return dt; -} - -#ifndef TQT_NO_DATESTRING -/*! - Returns the TQDateTime represented by the string \a s, using the - format \a f, or an invalid datetime if this is not possible. - - Note for \c TQt::TextDate: It is recommended that you use the - English short month names (e.g. "Jan"). Although localized month - names can also be used, they depend on the user's locale settings. - - \warning Note that \c TQt::LocalDate cannot be used here. -*/ -TQDateTime TQDateTime::fromString( const TQString& s, TQt::DateFormat f ) -{ - if ( ( s.isEmpty() ) || ( f == TQt::LocalDate ) ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQDateTime::fromString: Parameter out of range" ); -#endif - TQDateTime dt; - dt.d.jd = 0; - return dt; - } - if ( f == TQt::ISODate ) { - return TQDateTime( TQDate::fromString( s.mid(0,10), TQt::ISODate ), - TQTime::fromString( s.mid(11), TQt::ISODate ) ); - } -#if !defined(TQT_NO_REGEXP) && !defined(TQT_NO_TEXTDATE) - else if ( f == TQt::TextDate ) { - const int firstSpace = s.find(' '); - TQString monthName( s.mid( firstSpace + 1, 3 ) ); - int month = -1; - // Assume that English monthnames are the default - for ( int i = 0; i < 12; ++i ) { - if ( monthName == qt_shortMonthNames[i] ) { - month = i + 1; - break; - } - } - // If English names can't be found, search the localized ones - if ( month == -1 ) { - for ( int i = 1; i <= 12; ++i ) { - if ( monthName == TQDate::shortMonthName( i ) ) { - month = i; - break; - } - } - } -#if defined(TQT_CHECK_RANGE) - if ( month < 1 || month > 12 ) { - qWarning( "TQDateTime::fromString: Parameter out of range" ); - TQDateTime dt; - dt.d.jd = 0; - return dt; - } -#endif - int day = TQT_TQSTRING(s.mid( firstSpace + 5, 2 )).simplifyWhiteSpace().toInt(); - int year = s.right( 4 ).toInt(); - TQDate date( year, month, day ); - TQTime time; - int hour, minute, second; - int pivot = s.find( TQRegExp(TQString::tqfromLatin1("[0-9][0-9]:[0-9][0-9]:[0-9][0-9]")) ); - if ( pivot != -1 ) { - hour = s.mid( pivot, 2 ).toInt(); - minute = s.mid( pivot+3, 2 ).toInt(); - second = s.mid( pivot+6, 2 ).toInt(); - time.setHMS( hour, minute, second ); - } - return TQDateTime( date, time ); - } -#endif //TQT_NO_REGEXP - return TQDateTime(); -} -#endif //TQT_NO_DATESTRING - - -/***************************************************************************** - Date/time stream functions - *****************************************************************************/ - -#ifndef TQT_NO_DATASTREAM -/*! - \relates TQDate - - Writes the date, \a d, to the data stream, \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator<<( TQDataStream &s, const TQDate &d ) -{ - return s << (TQ_UINT32)(d.jd); -} - -/*! - \relates TQDate - - Reads a date from the stream \a s into \a d. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator>>( TQDataStream &s, TQDate &d ) -{ - TQ_UINT32 jd; - s >> jd; - d.jd = jd; - return s; -} - -/*! - \relates TQTime - - Writes time \a t to the stream \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator<<( TQDataStream &s, const TQTime &t ) -{ - return s << (TQ_UINT32)(t.ds); -} - -/*! - \relates TQTime - - Reads a time from the stream \a s into \a t. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator>>( TQDataStream &s, TQTime &t ) -{ - TQ_UINT32 ds; - s >> ds; - t.ds = ds; - return s; -} - -/*! - \relates TQDateTime - - Writes the datetime \a dt to the stream \a s. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator<<( TQDataStream &s, const TQDateTime &dt ) -{ - return s << dt.d << dt.t; -} - -/*! - \relates TQDateTime - - Reads a datetime from the stream \a s into \a dt. - - \sa \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator>>( TQDataStream &s, TQDateTime &dt ) -{ - s >> dt.d >> dt.t; - return s; -} -#endif //TQT_NO_DATASTREAM - -#endif // USE_QT4
\ No newline at end of file diff --git a/tqtinterface/qt4/src/tools/tqdatetime.h b/tqtinterface/qt4/src/tools/tqdatetime.h deleted file mode 100644 index aaf0727..0000000 --- a/tqtinterface/qt4/src/tools/tqdatetime.h +++ /dev/null @@ -1,374 +0,0 @@ -/************************************************************************* -** -** Definition of date and time classes -** -** Created : 940124 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQDATETIME_H -#define TQDATETIME_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqstring.h" -#include "tqnamespace.h" -#endif // TQT_H - -#ifdef USE_QT4 - -#include <Qt/qdatetime.h> - -#endif // USE_QT4 - - -#ifdef USE_QT4 - -class TQ_EXPORT TQDate : public QDate -{ -public: - TQDate() : QDate() {} - TQDate( QDate date ) : QDate(date) {} - TQDate( int y, int m, int d ) : QDate( y, m, d ) {} - - inline static TQString monthName(int month) { return shortMonthName(month); } - inline static TQString dayName(int weekday) { return shortDayName(weekday); } - inline static bool leapYear(int year) { return isLeapYear(year); } - - static inline TQDate currentDate() { return TQT_TQDATE_OBJECT(QDate::currentDate()); } - static inline TQDate tqcurrentDate() { return currentDate(); } - static inline TQDate fromString( const TQString& s, Qt::DateFormat f = Qt::TextDate ) { return TQT_TQDATE_OBJECT(QDate::fromString(s, f)); } - static TQDate currentDate(Qt::TimeSpec spec); - static inline TQDate tqcurrentDate(Qt::TimeSpec spec) { return currentDate(spec); } - - inline TQDate addDays( int days ) const { return TQT_TQDATE_OBJECT(addDays(days)); } - inline TQDate addMonths( int months ) const { return TQT_TQDATE_OBJECT(addMonths(months)); } - inline TQDate addYears( int years ) const { return TQT_TQDATE_OBJECT(addYears(years)); } - - // Interoperability - inline static TQDate convertFromQDate( QDate q ) { - return (*static_cast<TQDate*>(&q)); - } - inline static TQDate& convertFromQDate( QDate& q ) { - return (*static_cast<TQDate*>(&q)); - } -}; - -class TQ_EXPORT TQTime : public QTime -{ -public: - TQTime() : QTime() {} - TQTime( QTime time ) : QTime(time) {} - TQTime( int h, int m, int s=0, int ms=0 ) : QTime ( h, m, s, ms ) {} - - inline static TQTime currentTime() { return TQT_TQTIME_OBJECT(QTime::currentTime()); } - inline static TQTime tqcurrentTime() { return currentTime(); } - inline static TQTime fromString( const TQString& s, Qt::DateFormat f = Qt::TextDate ) { return TQT_TQTIME_OBJECT(QTime::fromString(s, f)); } - static TQTime currentTime(Qt::TimeSpec spec); - inline static TQTime tqcurrentTime(Qt::TimeSpec spec) { return currentTime(spec); } - - // Interoperability - inline static TQTime convertFromQTime( QTime q ) { - return (*static_cast<TQTime*>(&q)); - } - inline static TQTime& convertFromQTime( QTime& q ) { - return (*static_cast<TQTime*>(&q)); - } -}; - -class TQ_EXPORT TQDateTime : public QDateTime -{ -public: - TQDateTime() : QDateTime() {} - TQDateTime( const QDateTime &dt ) : QDateTime ( dt ) {} - TQDateTime( const QDate &date ) : QDateTime ( date ) {} - TQDateTime( const QDate &date, const QTime &time ) : QDateTime( date, time ) {} - - void setTime_t(uint secsSince1Jan1970UTC) { QDateTime::setTime_t(secsSince1Jan1970UTC); } - static inline TQDateTime tqcurrentDateTime() { return TQT_TQDATETIME_OBJECT(QDateTime::currentDateTime()); } - inline void setTime_t(uint secsSince1Jan1970UTC, Qt::TimeSpec spec) { - setTime_t(secsSince1Jan1970UTC); - if (spec == Qt::UTC) - *this = TQT_TQDATETIME_OBJECT(toUTC()); - } - static inline TQDateTime tqcurrentDateTime(Qt::TimeSpec spec) { - if (spec == Qt::LocalTime) - return tqcurrentDateTime(); - else - return TQT_TQDATETIME_OBJECT(currentDateTime().toUTC()); - } - - static inline TQDateTime fromString( const QString s, Qt::DateFormat f = Qt::TextDate ) { return TQT_TQDATETIME_OBJECT(QDateTime::fromString(s, f)); } - - inline TQString toString(Qt::DateFormat f = Qt::TextDate) const { return QDateTime::toString(f); } - inline TQString toString(const QString &format) const { return QDateTime::toString(format); } - - TQDate date() const { return TQT_TQDATE_OBJECT(QDateTime::date()); } - TQTime time() const { return TQT_TQTIME_OBJECT(QDateTime::time()); } - - // Interoperability - inline static TQDateTime convertFromQDateTime( QDateTime q ) { - return (*static_cast<TQDateTime*>(&q)); - } - inline static TQDateTime& convertFromQDateTime( QDateTime& q ) { - return (*static_cast<TQDateTime*>(&q)); - } -}; - -inline TQDate TQDate::currentDate(Qt::TimeSpec spec) -{ - if (spec == Qt::LocalTime) - return TQT_TQDATE_OBJECT(currentDate()); - else - return TQT_TQDATE_OBJECT(QDateTime::currentDateTime().toUTC().date()); -} - -inline TQTime TQTime::currentTime(Qt::TimeSpec spec) -{ - if (spec == Qt::LocalTime) - return TQT_TQTIME_OBJECT(currentTime()); - else - return TQT_TQTIME_OBJECT(QDateTime::currentDateTime().toUTC().time()); -} - -#else // USE_QT4 - -/***************************************************************************** - TQDate class - *****************************************************************************/ - -class TQ_EXPORT TQDate -{ -public: - TQDate() { jd = 0; } - TQDate( int y, int m, int d ); - - bool isNull() const { return jd == 0; } - bool isValid() const; - - int year() const; - int month() const; - int day() const; - int dayOfWeek() const; - int dayOfYear() const; - int daysInMonth() const; - int daysInYear() const; - int weekNumber( int *yearNum = 0 ) const; - -#ifndef TQT_NO_TEXTDATE -#ifndef TQT_NO_COMPAT - static TQString monthName( int month ) { return shortMonthName( month ); } - static TQString dayName( int weekday ) { return shortDayName( weekday ); } -#endif - static TQString shortMonthName( int month ); - static TQString shortDayName( int weekday ); - static TQString longMonthName( int month ); - static TQString longDayName( int weekday ); -#endif //TQT_NO_TEXTDATE -#ifndef TQT_NO_TEXTSTRING -#if !defined(TQT_NO_SPRINTF) - TQString toString( TQt::DateFormat f = TQt::TextDate ) const; -#endif - TQString toString( const TQString& format ) const; -#endif - bool setYMD( int y, int m, int d ); - - TQDate addDays( int days ) const; - TQDate addMonths( int months ) const; - TQDate addYears( int years ) const; - int daysTo( const TQDate & ) const; - - bool operator==( const TQDate &d ) const { return jd == d.jd; } - bool operator!=( const TQDate &d ) const { return jd != d.jd; } - bool operator<( const TQDate &d ) const { return jd < d.jd; } - bool operator<=( const TQDate &d ) const { return jd <= d.jd; } - bool operator>( const TQDate &d ) const { return jd > d.jd; } - bool operator>=( const TQDate &d ) const { return jd >= d.jd; } - - static TQDate currentDate(); - static TQDate currentDate( TQt::TimeSpec ); -#ifndef TQT_NO_DATESTRING - static TQDate fromString( const TQString& s, TQt::DateFormat f = TQt::TextDate ); -#endif - static bool isValid( int y, int m, int d ); - static bool leapYear( int year ); - - static uint gregorianToJulian( int y, int m, int d ); - static void julianToGregorian( uint jd, int &y, int &m, int &d ); -private: - uint jd; - friend class TQDateTime; -#ifndef TQT_NO_DATASTREAM - friend TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQDate & ); - friend TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQDate & ); -#endif -}; - - -/***************************************************************************** - TQTime class - *****************************************************************************/ - -class TQ_EXPORT TQTime -{ -public: - TQTime() { ds=0; } // set null time - TQTime( int h, int m, int s=0, int ms=0 ); // set time - - bool isNull() const { return ds == 0; } - bool isValid() const; // valid time - - int hour() const; // 0..23 - int minute() const; // 0..59 - int second() const; // 0..59 - int msec() const; // 0..999 -#ifndef TQT_NO_DATESTRING -#ifndef TQT_NO_SPRINTF - TQString toString( TQt::DateFormat f = TQt::TextDate ) const; -#endif - TQString toString( const TQString& format ) const; -#endif - bool setHMS( int h, int m, int s, int ms=0 ); - - TQTime addSecs( int secs ) const; - int secsTo( const TQTime & ) const; - TQTime addMSecs( int ms ) const; - int msecsTo( const TQTime & ) const; - - bool operator==( const TQTime &d ) const { return ds == d.ds; } - bool operator!=( const TQTime &d ) const { return ds != d.ds; } - bool operator<( const TQTime &d ) const { return ds < d.ds; } - bool operator<=( const TQTime &d ) const { return ds <= d.ds; } - bool operator>( const TQTime &d ) const { return ds > d.ds; } - bool operator>=( const TQTime &d ) const { return ds >= d.ds; } - - static TQTime currentTime(); - static TQTime currentTime( TQt::TimeSpec ); -#ifndef TQT_NO_DATESTRING - static TQTime fromString( const TQString& s, TQt::DateFormat f = TQt::TextDate ); -#endif - static bool isValid( int h, int m, int s, int ms=0 ); - - void start(); - int restart(); - int elapsed() const; - -private: - static bool currentTime( TQTime * ); - static bool currentTime( TQTime *, TQt::TimeSpec ); - - uint ds; - friend class TQDateTime; -#ifndef TQT_NO_DATASTREAM - friend TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQTime & ); - friend TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQTime & ); -#endif -}; - - -/***************************************************************************** - TQDateTime class - *****************************************************************************/ - -class TQ_EXPORT TQDateTime -{ -public: - TQDateTime() {} // set null date and null time - TQDateTime( const TQDate & ); - TQDateTime( const TQDate &, const TQTime & ); - - bool isNull() const { return d.isNull() && t.isNull(); } - bool isValid() const { return d.isValid() && t.isValid(); } - - TQDate date() const { return d; } - TQTime time() const { return t; } - uint toTime_t() const; - void setDate( const TQDate &date ) { d = date; } - void setTime( const TQTime &time ) { t = time; } - void setTime_t( uint secsSince1Jan1970UTC ); - void setTime_t( uint secsSince1Jan1970UTC, TQt::TimeSpec ); -#ifndef TQT_NO_DATESTRING -#ifndef TQT_NO_SPRINTF - TQString toString( TQt::DateFormat f = TQt::TextDate ) const; -#endif - TQString toString( const TQString& format ) const; -#endif - TQDateTime addDays( int days ) const; - TQDateTime addMonths( int months ) const; - TQDateTime addYears( int years ) const; - TQDateTime addSecs( int secs ) const; - int daysTo( const TQDateTime & ) const; - int secsTo( const TQDateTime & ) const; - - bool operator==( const TQDateTime &dt ) const; - bool operator!=( const TQDateTime &dt ) const; - bool operator<( const TQDateTime &dt ) const; - bool operator<=( const TQDateTime &dt ) const; - bool operator>( const TQDateTime &dt ) const; - bool operator>=( const TQDateTime &dt ) const; - - static TQDateTime currentDateTime(); - static TQDateTime currentDateTime( TQt::TimeSpec ); -#ifndef TQT_NO_DATESTRING - static TQDateTime fromString( const TQString& s, TQt::DateFormat f = TQt::TextDate ); -#endif -private: - TQDate d; - TQTime t; -#ifndef TQT_NO_DATASTREAM - friend TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQDateTime &); - friend TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQDateTime & ); -#endif -}; - - -/***************************************************************************** - Date and time stream functions - *****************************************************************************/ - -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQDate & ); -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQDate & ); -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQTime & ); -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQTime & ); -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQDateTime & ); -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQDateTime & ); -#endif // TQT_NO_DATASTREAM - -#endif // USE_QT4 - -#endif // TQDATETIME_H - diff --git a/tqtinterface/qt4/src/tools/tqdeepcopy.cpp b/tqtinterface/qt4/src/tools/tqdeepcopy.cpp deleted file mode 100644 index 4a5095e..0000000 --- a/tqtinterface/qt4/src/tools/tqdeepcopy.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQDeepCopy class -** -** Created : 20020613 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the kernel module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqdeepcopy.h" - -/*! - \class TQDeepCopy tqdeepcopy.h - \brief The TQDeepCopy class is a template class which ensures that - implicitly shared and explicitly shared classes reference unique - data. - - \reentrant - - \ingroup tools - \ingroup shared - - Normally, shared copies reference the same data to optimize memory - use and for maximum speed. In the example below, \c s1, \c s2, \c - s3, \c s4 and \c s5 share data. - - \code - // all 5 strings share the same data - TQString s1 = "abcd"; - TQString s2 = s1; - TQString s3 = s2; - TQString s4 = s3; - TQString s5 = s2; - \endcode - - TQDeepCopy can be used several ways to ensure that an object - references unique, unshared data. In the example below, \c s1, \c - s2 and \c s5 share data, while neither \c s3 nor \c s4 share data. - \code - // s1, s2 and s5 share the same data, neither s3 nor s4 are shared - TQString s1 = "abcd"; - TQString s2 = s1; - TQDeepCopy<TQString> s3 = s2; // s3 is a deep copy of s2 - TQString s4 = s3; // s4 is a deep copy of s3 - TQString s5 = s2; - \endcode - - In the example below, \c s1, \c s2 and \c s5 share data, and \c s3 - and \c s4 share data. - \code - // s1, s2 and s5 share the same data, s3 and s4 share the same data - TQString s1 = "abcd"; - TQString s2 = s1; - TQString s3 = TQDeepCopy<TQString>( s2 ); // s3 is a deep copy of s2 - TQString s4 = s3; // s4 is a shallow copy of s3 - TQString s5 = s2; - \endcode - - TQDeepCopy can also provide safety in multithreaded applications - that use shared classes. In the example below, the variable \c - global_string is used safely since the data contained in \c - global_string is always a deep copy. This ensures that all threads - get a unique copy of the data, and that any assignments to \c - global_string will result in a deep copy. - - \code - TQDeepCopy<TQString> global_string; // global string data - TQMutex global_mutex; // mutex to protext global_string - - ... - - void setGlobalString( const TQString &str ) - { - global_mutex.lock(); - global_string = str; // global_string is a deep copy of str - global_mutex.unlock(); - } - - ... - - void MyThread::run() - { - global_mutex.lock(); - TQString str = global_string; // str is a deep copy of global_string - global_mutex.unlock(); - - // process the string data - ... - - // update global_string - setGlobalString( str ); - } - \endcode - - \warning It is the application developer's responsibility to - protect the object shared across multiple threads. - - The examples above use TQString, which is an implicitly shared - class. The behavior of TQDeepCopy is the same when using explicitly - shared classes like TQByteArray. - - Currently, TQDeepCopy works with the following classes: - \list - \i TQMemArray (including subclasses like TQByteArray and TQCString) - \i TQMap - \i TQString - \i TQValueList (including subclasses like TQStringList and TQValueStack) - \i TQValueVector - \endlist - - \sa \link threads.html Thread Support in TQt \endlink -*/ - -/*! - \fn TQDeepCopy::TQDeepCopy() - - Constructs an empty instance of type \e T. -*/ - -/*! - \fn TQDeepCopy::TQDeepCopy( const T &t ) - - Constructs a deep copy of \a t. -*/ - -/*! - \fn TQDeepCopy<T>& TQDeepCopy::operator=( const T &t ) - - Assigns a deep copy of \a t. -*/ - -/*! - \fn TQDeepCopy::operator T () - - Returns a deep copy of the encapsulated data. -*/ - diff --git a/tqtinterface/qt4/src/tools/tqdeepcopy.h b/tqtinterface/qt4/src/tools/tqdeepcopy.h deleted file mode 100644 index 900f9c0..0000000 --- a/tqtinterface/qt4/src/tools/tqdeepcopy.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Definition of TQDeepCopy class -** -** Created : 20020613 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the kernel module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQDEEPCOPY_H -#define TQDEEPCOPY_H - -#ifndef TQT_H -# include "tqglobal.h" -#endif // TQT_H - -template <class T> -class TQDeepCopy -{ -public: - inline TQDeepCopy() - { - } - - inline TQDeepCopy( const T &t ) - : deepcopy( t ) - { - deepcopy.detach(); - } - - inline TQDeepCopy<T> &operator=( const T &t ) - { - deepcopy = t; - deepcopy.detach(); - return *this; - } - - inline operator T () - { - T tmp = deepcopy; - tmp.detach(); - return tmp; - } - -private: - T deepcopy; -}; - -#endif // TQDEEPCOPY_H diff --git a/tqtinterface/qt4/src/tools/tqdict.h b/tqtinterface/qt4/src/tools/tqdict.h deleted file mode 100644 index b9fab7f..0000000 --- a/tqtinterface/qt4/src/tools/tqdict.h +++ /dev/null @@ -1,123 +0,0 @@ -/**************************************************************************** -** -** Definition of TQDict template class -** -** Created : 920821 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQDICT_H -#define TQDICT_H - -#ifndef TQT_H -#include "tqgdict.h" -#endif // TQT_H - -template<class type> -class TQDict -#ifdef TQ_TQDOC - : public TQPtrCollection -#else - : public TQGDict -#endif -{ -public: - TQDict( int size = 17, bool caseSensitive = TRUE ) - : TQGDict( size, StringKey, caseSensitive, FALSE ) { } - TQDict( const TQDict<type> &d ) : TQGDict( d ) { } - ~TQDict() { clear(); } - TQDict<type> &operator=(const TQDict<type> &d) - { return (TQDict<type>&)TQGDict::operator=(d); } - uint count() const { return TQGDict::count(); } - uint size() const { return TQGDict::size(); } - bool isEmpty() const { return TQGDict::count() == 0; } - - void insert( const TQString &k, const type *d ) - { TQGDict::look_string(k,(Item)d,1); } - void replace( const TQString &k, const type *d ) - { TQGDict::look_string(k,(Item)d,2); } - bool remove( const TQString &k ) { return TQGDict::remove_string(k); } - type *take( const TQString &k ) { return (type *)TQGDict::take_string(k); } - type *find( const TQString &k ) const - { return (type *)((TQGDict*)this)->TQGDict::look_string(k,0,0); } - type *operator[]( const TQString &k ) const - { return (type *)((TQGDict*)this)->TQGDict::look_string(k,0,0); } - - void clear() { TQGDict::clear(); } - void resize( uint n ) { TQGDict::resize(n); } - void statistics() const { TQGDict::statistics(); } - -#ifdef TQ_TQDOC -protected: - virtual TQDataStream& read( TQDataStream &, TQPtrCollection::Item & ); - virtual TQDataStream& write( TQDataStream &, TQPtrCollection::Item ) const; -#endif - -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQDict<void>::deleteItem( Item ) -{ -} -#endif - -template<class type> inline void TQDict<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type *)d; -} - -template<class type> -class TQDictIterator : public TQGDictIterator -{ -public: - TQDictIterator(const TQDict<type> &d) : TQGDictIterator((TQGDict &)d) { } - ~TQDictIterator() {} - uint count() const { return dict->count(); } - bool isEmpty() const { return dict->count() == 0; } - type *toFirst() { return (type *)TQGDictIterator::toFirst(); } - operator type *() const { return (type *)TQGDictIterator::get(); } - type *operator*() { return (type *)TQGDictIterator::get(); } - type *current() const { return (type *)TQGDictIterator::get(); } - TQString currentKey() const{ return TQGDictIterator::getKeyString(); } - type *operator()() { return (type *)TQGDictIterator::operator()(); } - type *operator++() { return (type *)TQGDictIterator::operator++(); } - type *operator+=(uint j) { return (type *)TQGDictIterator::operator+=(j); } -}; - -#define TQ_DEFINED_TQDICT -#include "tqwinexport.h" -#endif // TQDICT_H diff --git a/tqtinterface/qt4/src/tools/tqdir.cpp b/tqtinterface/qt4/src/tools/tqdir.cpp deleted file mode 100644 index 311a44d..0000000 --- a/tqtinterface/qt4/src/tools/tqdir.cpp +++ /dev/null @@ -1,1390 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQDir class -** -** Created : 950427 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" -#include "tqdir.h" - -#ifndef TQT_NO_DIR -#include <private/tqdir_p.h> -#include "tqfileinfo.h" -#include "tqregexp.h" -#include "tqstringlist.h" -#include "tqdeepcopy.h" -#include <limits.h> - -#if defined(TQ_FS_FAT) && !defined(TQ_OS_UNIX) -const bool CaseSensitiveFS = FALSE; -#else -const bool CaseSensitiveFS = TRUE; -#endif - - -/*! - \class TQDir - \reentrant - \brief The TQDir class provides access to directory structures and their contents in a platform-independent way. - - \ingroup io - \mainclass - - A TQDir is used to manipulate path names, access information - regarding paths and files, and manipulate the underlying file - system. - - A TQDir can point to a file using either a relative or an absolute - path. Absolute paths begin with the directory separator "/" - (optionally preceded by a drive specification under Windows). If - you always use "/" as a directory separator, TQt will translate - your paths to conform to the underlying operating system. Relative - file names begin with a directory name or a file name and specify - a path relative to the current directory. - - The "current" path refers to the application's working directory. - A TQDir's own path is set and retrieved with setPath() and path(). - - An example of an absolute path is the string "/tmp/quartz", a - relative path might look like "src/fatlib". You can use the - function isRelative() to check if a TQDir is using a relative or an - absolute file path. Call convertToAbs() to convert a relative TQDir - to an absolute one. For a simplified path use cleanDirPath(). To - obtain a path which has no symbolic links or redundant ".." - elements use canonicalPath(). The path can be set with setPath(), - and changed with cd() and cdUp(). - - TQDir provides several static functions, for example, setCurrent() - to set the application's working directory and currentDirPath() to - retrieve the application's working directory. Access to some - common paths is provided with the static functions, current(), - home() and root() which return TQDir objects or currentDirPath(), - homeDirPath() and rootDirPath() which return the path as a string. - If you want to know about your application's path use - \l{TQApplication::applicationDirPath()}. - - The number of entries in a directory is returned by count(). - Obtain a string list of the names of all the files and directories - in a directory with entryList(). If you prefer a list of TQFileInfo - pointers use entryInfoList(). Both these functions can apply a - name filter, an attributes filter (e.g. read-only, files not - directories, etc.), and a sort order. The filters and sort may be - set with calls to setNameFilter(), setFilter() and setSorting(). - They may also be specified in the entryList() and - entryInfoList()'s arguments. - - Create a new directory with mkdir(), rename a directory with - rename() and remove an existing directory with rmdir(). Remove a - file with remove(). You can interrogate a directory with exists(), - isReadable() and isRoot(). - - To get a path with a filename use filePath(), and to get a - directory name use dirName(); neither of these functions checks - for the existence of the file or directory. - - The list of root directories is provided by drives(); on Unix - systems this returns a list containing one root directory, "/"; on - Windows the list will usually contain "C:/", and possibly "D:/", - etc. - - It is easiest to work with "/" separators in TQt code. If you need - to present a path to the user or need a path in a form suitable - for a function in the underlying operating system use - convertSeparators(). - - Examples: - - See if a directory exists. - \code - TQDir d( "example" ); // "./example" - if ( !d.exists() ) - qWarning( "Cannot find the example directory" ); - \endcode - - Traversing directories and reading a file. - \code - TQDir d = TQDir::root(); // "/" - if ( !d.cd("tmp") ) { // "/tmp" - qWarning( "Cannot find the \"/tmp\" directory" ); - } else { - TQFile f( d.filePath("ex1.txt") ); // "/tmp/ex1.txt" - if ( !f.open(IO_ReadWrite) ) - qWarning( "Cannot create the file %s", f.name() ); - } - \endcode - - A program that lists all the files in the current directory - (excluding symbolic links), sorted by size, smallest first: - \code - #include <stdio.h> - #include <tqdir.h> - - int main( int argc, char **argv ) - { - TQDir d; - d.setFilter( TQDir::Files | TQDir::Hidden | TQDir::NoSymLinks ); - d.setSorting( TQDir::Size | TQDir::Reversed ); - - const TQFileInfoList *list = d.entryInfoList(); - TQFileInfoListIterator it( *list ); - TQFileInfo *fi; - - printf( " Bytes Filename\n" ); - while ( (fi = it.current()) != 0 ) { - printf( "%10li %s\n", fi->size(), fi->fileName().latin1() ); - ++it; - } - return 0; - } - \endcode - - \sa TQApplication::applicationDirPath() -*/ - -/*! - Constructs a TQDir pointing to the current directory ("."). - - \sa currentDirPath() -*/ - -TQDir::TQDir() -{ - dPath = TQString::tqfromLatin1("."); - init(); -} - -/*! - Constructs a TQDir with path \a path, that filters its entries by - name using \a nameFilter and by attributes using \a filterSpec. It - also sorts the names using \a sortSpec. - - The default \a nameFilter is an empty string, which excludes - nothing; the default \a filterSpec is \c All, which also means - exclude nothing. The default \a sortSpec is \c Name|IgnoreCase, - i.e. sort by name case-insensitively. - - Example that lists all the files in "/tmp": - \code - TQDir d( "/tmp" ); - for ( int i = 0; i < d.count(); i++ ) - printf( "%s\n", d[i] ); - \endcode - - If \a path is "" or TQString::null, TQDir uses "." (the current - directory). If \a nameFilter is "" or TQString::null, TQDir uses the - name filter "*" (all files). - - Note that \a path need not exist. - - \sa exists(), setPath(), setNameFilter(), setFilter(), setSorting() -*/ - -TQDir::TQDir( const TQString &path, const TQString &nameFilter, - int sortSpec, int filterSpec ) -{ - init(); - dPath = cleanDirPath( path ); - if ( dPath.isEmpty() ) - dPath = TQString::tqfromLatin1("."); - nameFilt = nameFilter; - if ( nameFilt.isEmpty() ) - nameFilt = TQString::tqfromLatin1("*"); - filtS = (FilterSpec)filterSpec; - sortS = (SortSpec)sortSpec; -} - -/*! - Constructs a TQDir that is a copy of the directory \a d. - - \sa operator=() -*/ - -TQDir::TQDir( const TQDir &d ) -{ - dPath = d.dPath; - fList = 0; - fiList = 0; - nameFilt = d.nameFilt; - dirty = TRUE; - allDirs = d.allDirs; - filtS = d.filtS; - sortS = d.sortS; -} - -/*! - Refreshes the directory information. -*/ -void TQDir::refresh() const -{ - TQDir* that = (TQDir*) this; - that->dirty = TRUE; -} - -void TQDir::init() -{ - fList = 0; - fiList = 0; - nameFilt = TQString::tqfromLatin1("*"); - dirty = TRUE; - allDirs = FALSE; - filtS = All; - sortS = SortSpec(Name | IgnoreCase); -} - -/*! - Destroys the TQDir frees up its resources. -*/ - -TQDir::~TQDir() -{ - delete fList; - delete fiList; -} - - -/*! - Sets the path of the directory to \a path. The path is cleaned of - redundant ".", ".." and of multiple separators. No check is made - to ensure that a directory with this path exists. - - The path can be either absolute or relative. Absolute paths begin - with the directory separator "/" (optionally preceded by a drive - specification under Windows). Relative file names begin with a - directory name or a file name and specify a path relative to the - current directory. An example of an absolute path is the string - "/tmp/quartz", a relative path might look like "src/fatlib". - - \sa path(), absPath(), exists(), cleanDirPath(), dirName(), - absFilePath(), isRelative(), convertToAbs() -*/ - -void TQDir::setPath( const TQString &path ) -{ - dPath = cleanDirPath( path ); - if ( dPath.isEmpty() ) - dPath = TQString::tqfromLatin1("."); - dirty = TRUE; -} - -/*! - \fn TQString TQDir::path() const - - Returns the path, this may contain symbolic links, but never - contains redundant ".", ".." or multiple separators. - - The returned path can be either absolute or relative (see - setPath()). - - \sa setPath(), absPath(), exists(), cleanDirPath(), dirName(), - absFilePath(), convertSeparators() -*/ - -/*! - Returns the absolute path (a path that starts with "/" or with a - drive specification), which may contain symbolic links, but never - contains redundant ".", ".." or multiple separators. - - \sa setPath(), canonicalPath(), exists(), cleanDirPath(), - dirName(), absFilePath() -*/ - -TQString TQDir::absPath() const -{ - if ( TQDir::isRelativePath(dPath) ) { - TQString tmp = currentDirPath(); - if ( tmp.right(1) != TQString::tqfromLatin1("/") ) - tmp += '/'; - tmp += dPath; - return cleanDirPath( tmp ); - } else { - return cleanDirPath( dPath ); - } -} - -/*! - Returns the name of the directory; this is \e not the same as the - path, e.g. a directory with the name "mail", might have the path - "/var/spool/mail". If the directory has no name (e.g. it is the - root directory) TQString::null is returned. - - No check is made to ensure that a directory with this name - actually exists. - - \sa path(), absPath(), absFilePath(), exists(), TQString::isNull() -*/ - -TQString TQDir::dirName() const -{ - int pos = dPath.findRev( '/' ); - if ( pos == -1 ) - return dPath; - return dPath.right( dPath.length() - pos - 1 ); -} - -/*! - Returns the path name of a file in the directory. Does \e not - check if the file actually exists in the directory. If the TQDir is - relative the returned path name will also be relative. Redundant - multiple separators or "." and ".." directories in \a fileName - will not be removed (see cleanDirPath()). - - If \a acceptAbsPath is TRUE a \a fileName starting with a - separator "/" will be returned without change. If \a acceptAbsPath - is FALSE an absolute path will be prepended to the fileName and - the resultant string returned. - - \sa absFilePath(), isRelative(), canonicalPath() -*/ - -TQString TQDir::filePath( const TQString &fileName, - bool acceptAbsPath ) const -{ - if ( acceptAbsPath && !isRelativePath(fileName) ) - return TQString(fileName); - - TQString tmp = dPath; - if ( tmp.isEmpty() || (tmp[(int)tmp.length()-1] != '/' && !!fileName && - fileName[0] != '/') ) - tmp += '/'; - tmp += fileName; - return tmp; -} - -/*! - Returns the absolute path name of a file in the directory. Does \e - not check if the file actually exists in the directory. Redundant - multiple separators or "." and ".." directories in \a fileName - will not be removed (see cleanDirPath()). - - If \a acceptAbsPath is TRUE a \a fileName starting with a - separator "/" will be returned without change. If \a acceptAbsPath - is FALSE an absolute path will be prepended to the fileName and - the resultant string returned. - - \sa filePath() -*/ - -TQString TQDir::absFilePath( const TQString &fileName, - bool acceptAbsPath ) const -{ - if ( acceptAbsPath && !isRelativePath( fileName ) ) - return fileName; - - TQString tmp = absPath(); -#ifdef TQ_OS_WIN32 - if ( fileName[0].isLetter() && fileName[1] == ':' ) { - int drv = fileName.upper()[0].latin1() - 'A' + 1; - if ( _getdrive() != drv ) { - TQT_WA( { - TCHAR buf[PATH_MAX]; - ::_wgetdcwd( drv, buf, PATH_MAX ); - tmp.setUnicodeCodes( (ushort*)buf, (uint)::wcslen(buf) ); - }, { - char buf[PATH_MAX]; - ::_getdcwd( drv, buf, PATH_MAX ); - tmp = buf; - } ); - if ( !tmp.endsWith("\\") ) - tmp += "\\"; - tmp += fileName.right( fileName.length() - 2 ); - int x; - for ( x = 0; x < (int) tmp.length(); x++ ) { - if ( tmp[x] == '\\' ) - tmp[x] = '/'; - } - } - } else -#endif - { - if ( tmp.isEmpty() || (tmp[(int)tmp.length()-1] != '/' && !!fileName && - fileName[0] != '/') ) - tmp += '/'; - tmp += fileName; - } - return tmp; -} - - -/*! - Returns \a pathName with the '/' separators converted to - separators that are appropriate for the underlying operating - system. - - On Windows, convertSeparators("c:/winnt/system32") returns - "c:\winnt\system32". - - The returned string may be the same as the argument on some - operating systems, for example on Unix. -*/ - -TQString TQDir::convertSeparators( const TQString &pathName ) -{ - TQString n( pathName ); -#if defined(TQ_FS_FAT) || defined(TQ_OS_OS2EMX) - for ( int i=0; i<(int)n.length(); i++ ) { - if ( n[i] == '/' ) - n[i] = '\\'; - } -#elif defined(TQ_OS_MAC9) - while(n.length() && n[0] == '/' ) n = n.right(n.length()-1); - for ( int i=0; i<(int)n.length(); i++ ) { - if ( n[i] == '/' ) - n[i] = ':'; - } - if(n.contains(':') && n.left(1) != ':') - n.prepend(':'); -#endif - return n; -} - - -/*! - Changes the TQDir's directory to \a dirName. - - If \a acceptAbsPath is TRUE a path starting with separator "/" - will cause the function to change to the absolute directory. If \a - acceptAbsPath is FALSE any number of separators at the beginning - of \a dirName will be removed and the function will descend into - \a dirName. - - Returns TRUE if the new directory exists and is readable; - otherwise returns FALSE. Note that the logical cd() operation is - not performed if the new directory does not exist. - - Calling cd( ".." ) is equivalent to calling cdUp(). - - \sa cdUp(), isReadable(), exists(), path() -*/ - -bool TQDir::cd( const TQString &dirName, bool acceptAbsPath ) -{ - if ( dirName.isEmpty() || dirName == TQString::tqfromLatin1(".") ) - return TRUE; - TQString old = dPath; - if ( acceptAbsPath && !isRelativePath(dirName) ) { - dPath = cleanDirPath( dirName ); - } else { - if ( isRoot() ) { - if ( dirName == ".." ) { - dPath = old; - return FALSE; - } - } else { - dPath += '/'; - } - - dPath += dirName; - if ( dirName.find('/') >= 0 - || old == TQString::tqfromLatin1(".") - || dirName == TQString::tqfromLatin1("..") ) { - dPath = cleanDirPath( dPath ); - - /* - If dPath starts with .., we convert it to absolute to - avoid infinite looping on - - TQDir dir( "." ); - while ( dir.cdUp() ) - ; - */ - if ( dPath[0] == TQChar('.') && dPath[1] == TQChar('.') && - (dPath.length() == 2 || dPath[2] == TQChar('/')) ) - convertToAbs(); - } - } - if ( !exists() ) { - dPath = old; // regret - return FALSE; - } - dirty = TRUE; - return TRUE; -} - -/*! - Changes directory by moving one directory up from the TQDir's - current directory. - - Returns TRUE if the new directory exists and is readable; - otherwise returns FALSE. Note that the logical cdUp() operation is - not performed if the new directory does not exist. - - \sa cd(), isReadable(), exists(), path() -*/ - -bool TQDir::cdUp() -{ - return cd( TQString::tqfromLatin1("..") ); -} - -/*! - \fn TQString TQDir::nameFilter() const - - Returns the string set by setNameFilter() -*/ - -/*! - Sets the name filter used by entryList() and entryInfoList() to \a - nameFilter. - - The \a nameFilter is a wildcard (globbing) filter that understands - "*" and "?" wildcards. (See \link tqregexp.html#wildcard-matching - TQRegExp wildcard matching\endlink.) You may specify several filter - entries all separated by a single space " " or by a semi-colon - ";". - - For example, if you want entryList() and entryInfoList() to list - all files ending with either ".cpp" or ".h", you would use either - dir.setNameFilter("*.cpp *.h") or dir.setNameFilter("*.cpp;*.h"). - - \sa nameFilter(), setFilter() -*/ - -void TQDir::setNameFilter( const TQString &nameFilter ) -{ - nameFilt = nameFilter; - if ( nameFilt.isEmpty() ) - nameFilt = TQString::tqfromLatin1("*"); - dirty = TRUE; -} - -/*! - \fn TQDir::FilterSpec TQDir::filter() const - - Returns the value set by setFilter() -*/ - -/*! - \enum TQDir::FilterSpec - - This enum describes the filtering options available to TQDir, e.g. - for entryList() and entryInfoList(). The filter value is specified - by OR-ing together values from the following list: - - \value Dirs List directories only. - \value Files List files only. - \value Drives List disk drives (ignored under Unix). - \value NoSymLinks Do not list symbolic links (ignored by operating - systems that don't support symbolic links). - \value All List directories, files, drives and symlinks (this does not list - broken symlinks unless you specify System). - \value TypeMask A mask for the the Dirs, Files, Drives and - NoSymLinks flags. - \value Readable List files for which the application has read access. - \value Writable List files for which the application has write access. - \value Executable List files for which the application has execute - access. Executables needs to be combined with Dirs or Files. - \value RWEMask A mask for the Readable, Writable and Executable flags. - \value Modified Only list files that have been modified (ignored - under Unix). - \value Hidden List hidden files (on Unix, files starting with a .). - \value System List system files (on Unix, FIFOs, sockets and - tqdevice files) - \value AccessMask A mask for the Readable, Writable, Executable - Modified, Hidden and System flags - \value DefaultFilter Internal flag. - - If you do not set any of \c Readable, \c Writable or \c - Executable, TQDir will set all three of them. This makes the - default easy to write and at the same time useful. - - Examples: \c Readable|Writable means list all files for which the - application has read access, write access or both. \c Dirs|Drives - means list drives, directories, all files that the application can - read, write or execute, and also symlinks to such - files/directories. -*/ - - -/*! - Sets the filter used by entryList() and entryInfoList() to \a - filterSpec. The filter is used to specify the kind of files that - should be returned by entryList() and entryInfoList(). See - \l{TQDir::FilterSpec}. - - \sa filter(), setNameFilter() -*/ - -void TQDir::setFilter( int filterSpec ) -{ - if ( filtS == (FilterSpec) filterSpec ) - return; - filtS = (FilterSpec) filterSpec; - dirty = TRUE; -} - -/*! - \fn TQDir::SortSpec TQDir::sorting() const - - Returns the value set by setSorting() - - \sa setSorting() SortSpec -*/ - -/*! - \enum TQDir::SortSpec - - This enum describes the sort options available to TQDir, e.g. for - entryList() and entryInfoList(). The sort value is specified by - OR-ing together values from the following list: - - \value Name Sort by name. - \value Time Sort by time (modification time). - \value Size Sort by file size. - \value Unsorted Do not sort. - \value SortByMask A mask for Name, Time and Size. - - \value DirsFirst Put the directories first, then the files. - \value Reversed Reverse the sort order. - \value IgnoreCase Sort case-insensitively. - \value LocaleAware Sort names using locale aware compares - \value DefaultSort Internal flag. - - You can only specify one of the first four. - - If you specify both \c DirsFirst and \c Reversed, directories are - still put first, but in reverse order; the files will be listed - after the directories, again in reverse order. -*/ - -// ### Unsorted+DirsFirst ? Unsorted+Reversed? - -/*! - Sets the sort order used by entryList() and entryInfoList(). - - The \a sortSpec is specified by OR-ing values from the enum - \l{TQDir::SortSpec}. - - \sa sorting() SortSpec -*/ - -void TQDir::setSorting( int sortSpec ) -{ - if ( sortS == (SortSpec) sortSpec ) - return; - sortS = (SortSpec) sortSpec; - dirty = TRUE; -} - -/*! - \fn bool TQDir::matchAllDirs() const - - Returns the value set by setMatchAllDirs() - - \sa setMatchAllDirs() -*/ - -/*! - If \a enable is TRUE then all directories are included (e.g. in - entryList()), and the nameFilter() is only applied to the files. - If \a enable is FALSE then the nameFilter() is applied to both - directories and files. - - \sa matchAllDirs() -*/ - -void TQDir::setMatchAllDirs( bool enable ) -{ - if ( (bool)allDirs == enable ) - return; - allDirs = enable; - dirty = TRUE; -} - - -/*! - Returns the total number of directories and files that were found. - - Equivalent to entryList().count(). - - \sa operator[](), entryList() -*/ - -uint TQDir::count() const -{ - return (uint)entryList().count(); -} - -/*! - Returns the file name at position \a index in the list of file - names. Equivalent to entryList().at(index). - - Returns a TQString::null if the \a index is out of range or if the - entryList() function failed. - - \sa count(), entryList() -*/ - -TQString TQDir::operator[]( int index ) const -{ - entryList(); - return fList && index >= 0 && index < (int)fList->count() ? - (*fList)[index] : TQString::null; -} - - -/*! - \obsolete - This function is included to easy porting from TQt 1.x to TQt 2.0, - it is the same as entryList(), but encodes the filenames as 8-bit - strings using TQFile::encodedName(). - - It is more efficient to use entryList(). -*/ -TQStrList TQDir::encodedEntryList( int filterSpec, int sortSpec ) const -{ - TQStrList r; - TQStringList l = entryList(filterSpec,sortSpec); - for ( TQStringList::Iterator it = l.begin(); it != l.end(); ++it ) { - r.append( TQFile::encodeName(*it) ); - } - return r; -} - -/*! - \obsolete - \overload - This function is included to easy porting from TQt 1.x to TQt 2.0, - it is the same as entryList(), but encodes the filenames as 8-bit - strings using TQFile::encodedName(). - - It is more efficient to use entryList(). -*/ -TQStrList TQDir::encodedEntryList( const TQString &nameFilter, - int filterSpec, - int sortSpec ) const -{ - TQStrList r; - TQStringList l = entryList(nameFilter,filterSpec,sortSpec); - for ( TQStringList::Iterator it = l.begin(); it != l.end(); ++it ) { - r.append( TQFile::encodeName(*it) ); - } - return r; -} - - - -/*! - \overload - - Returns a list of the names of all the files and directories in - the directory, ordered in accordance with setSorting() and - filtered in accordance with setFilter() and setNameFilter(). - - The filter and sorting specifications can be overridden using the - \a filterSpec and \a sortSpec arguments. - - Returns an empty list if the directory is unreadable or does not - exist. - - \sa entryInfoList(), setNameFilter(), setSorting(), setFilter() -*/ - -TQStringList TQDir::entryList( int filterSpec, int sortSpec ) const -{ - if ( !dirty && filterSpec == (int)DefaultFilter && - sortSpec == (int)DefaultSort ) - return *fList; - return entryList( nameFilt, filterSpec, sortSpec ); -} - -/*! - Returns a list of the names of all the files and directories in - the directory, ordered in accordance with setSorting() and - filtered in accordance with setFilter() and setNameFilter(). - - The filter and sorting specifications can be overridden using the - \a nameFilter, \a filterSpec and \a sortSpec arguments. - - Returns an empty list if the directory is unreadable or does not - exist. - - \sa entryInfoList(), setNameFilter(), setSorting(), setFilter() -*/ - -TQStringList TQDir::entryList( const TQString &nameFilter, - int filterSpec, int sortSpec ) const -{ - if ( filterSpec == (int)DefaultFilter ) - filterSpec = filtS; - if ( sortSpec == (int)DefaultSort ) - sortSpec = sortS; - TQDir *that = (TQDir*)this; // mutable function - if ( that->readDirEntries(nameFilter, filterSpec, sortSpec) ) { - if ( that->fList ) - return *that->fList; - } - return TQStringList(); -} - -/*! - \overload - - Returns a list of TQFileInfo objects for all the files and - directories in the directory, ordered in accordance with - setSorting() and filtered in accordance with setFilter() and - setNameFilter(). - - The filter and sorting specifications can be overridden using the - \a filterSpec and \a sortSpec arguments. - - Returns 0 if the directory is unreadable or does not exist. - - The returned pointer is a const pointer to a TQFileInfoList. The - list is owned by the TQDir object and will be reused on the next - call to entryInfoList() for the same TQDir instance. If you want to - keep the entries of the list after a subsequent call to this - function you must copy them. - - Note: TQFileInfoList is really a TQPtrList<TQFileInfo>. - - \sa entryList(), setNameFilter(), setSorting(), setFilter() -*/ - -const TQFileInfoList *TQDir::entryInfoList( int filterSpec, int sortSpec ) const -{ - if ( !dirty && filterSpec == (int)DefaultFilter && - sortSpec == (int)DefaultSort ) - return fiList; - return entryInfoList( nameFilt, filterSpec, sortSpec ); -} - -/*! - Returns a list of TQFileInfo objects for all the files and - directories in the directory, ordered in accordance with - setSorting() and filtered in accordance with setFilter() and - setNameFilter(). - - The filter and sorting specifications can be overridden using the - \a nameFilter, \a filterSpec and \a sortSpec arguments. - - Returns 0 if the directory is unreadable or does not exist. - - The returned pointer is a const pointer to a TQFileInfoList. The - list is owned by the TQDir object and will be reused on the next - call to entryInfoList() for the same TQDir instance. If you want to - keep the entries of the list after a subsequent call to this - function you must copy them. - - Note: TQFileInfoList is really a TQPtrList<TQFileInfo>. - - \sa entryList(), setNameFilter(), setSorting(), setFilter() -*/ - -const TQFileInfoList *TQDir::entryInfoList( const TQString &nameFilter, - int filterSpec, int sortSpec ) const -{ - if ( filterSpec == (int)DefaultFilter ) - filterSpec = filtS; - if ( sortSpec == (int)DefaultSort ) - sortSpec = sortS; - TQDir *that = (TQDir*)this; // mutable function - if ( that->readDirEntries(nameFilter, filterSpec, sortSpec) ) - return that->fiList; - else - return 0; -} - -/*! - \overload - - Returns TRUE if the \e directory exists; otherwise returns FALSE. - (If a file with the same name is found this function will return - FALSE). - - \sa TQFileInfo::exists(), TQFile::exists() -*/ - -bool TQDir::exists() const -{ - TQFileInfo fi( dPath ); - return fi.exists() && fi.isDir(); -} - -/*! - Returns TRUE if the directory path is relative to the current - directory and returns FALSE if the path is absolute (e.g. under - UNIX a path is relative if it does not start with a "/"). - - \sa convertToAbs() -*/ - -bool TQDir::isRelative() const -{ - return isRelativePath( dPath ); -} - -/*! - Converts the directory path to an absolute path. If it is already - absolute nothing is done. - - \sa isRelative() -*/ - -void TQDir::convertToAbs() -{ - dPath = absPath(); -} - -/*! - Makes a copy of TQDir \a d and assigns it to this TQDir. -*/ - -TQDir &TQDir::operator=( const TQDir &d ) -{ - dPath = d.dPath; - delete fList; - fList = 0; - delete fiList; - fiList = 0; - nameFilt = d.nameFilt; - dirty = TRUE; - allDirs = d.allDirs; - filtS = d.filtS; - sortS = d.sortS; - return *this; -} - -/*! - \overload - - Sets the directory path to be the given \a path. -*/ - -TQDir &TQDir::operator=( const TQString &path ) -{ - dPath = cleanDirPath( path ); - dirty = TRUE; - return *this; -} - - -/*! - \fn bool TQDir::operator!=( const TQDir &d ) const - - Returns TRUE if directory \a d and this directory have different - paths or different sort or filter settings; otherwise returns - FALSE. - - Example: - \code - // The current directory is "/usr/local" - TQDir d1( "/usr/local/bin" ); - TQDir d2( "bin" ); - if ( d1 != d2 ) - qDebug( "They differ" ); - \endcode -*/ - -/*! - Returns TRUE if directory \a d and this directory have the same - path and their sort and filter settings are the same; otherwise - returns FALSE. - - Example: - \code - // The current directory is "/usr/local" - TQDir d1( "/usr/local/bin" ); - TQDir d2( "bin" ); - d2.convertToAbs(); - if ( d1 == d2 ) - qDebug( "They're the same" ); - \endcode -*/ - -bool TQDir::operator==( const TQDir &d ) const -{ - return dPath == d.dPath && - nameFilt == d.nameFilt && - allDirs == d.allDirs && - filtS == d.filtS && - sortS == d.sortS; -} - - -/*! - Removes the file, \a fileName. - - If \a acceptAbsPath is TRUE a path starting with separator "/" - will remove the file with the absolute path. If \a acceptAbsPath - is FALSE any number of separators at the beginning of \a fileName - will be removed and the resultant file name will be removed. - - Returns TRUE if the file is removed successfully; otherwise - returns FALSE. -*/ - -bool TQDir::remove( const TQString &fileName, bool acceptAbsPath ) -{ - if ( fileName.isEmpty() ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQDir::remove: Empty or null file name" ); -#endif - return FALSE; - } - TQString p = filePath( fileName, acceptAbsPath ); - return TQFile::remove( p ); -} - -/*! - Checks for the existence of the file \a name. - - If \a acceptAbsPath is TRUE a path starting with separator "/" - will check the file with the absolute path. If \a acceptAbsPath is - FALSE any number of separators at the beginning of \a name will be - removed and the resultant file name will be checked. - - Returns TRUE if the file exists; otherwise returns FALSE. - - \sa TQFileInfo::exists(), TQFile::exists() -*/ - -bool TQDir::exists( const TQString &name, bool acceptAbsPath ) //### const in 4.0 -{ - if ( name.isEmpty() ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQDir::exists: Empty or null file name" ); -#endif - return FALSE; - } - TQString tmp = filePath( name, acceptAbsPath ); - return TQFile::exists( tmp ); -} - -/*! - Returns the native directory separator; "/" under UNIX (including - Mac OS X) and "\" under Windows. - - You do not need to use this function to build file paths. If you - always use "/", TQt will translate your paths to conform to the - underlying operating system. -*/ - -char TQDir::separator() -{ -#if defined(TQ_OS_UNIX) - return '/'; -#elif defined (TQ_FS_FAT) || defined(TQ_WS_WIN) - return '\\'; -#elif defined (TQ_OS_MAC) - return ':'; -#else - return '/'; -#endif -} - -/*! - Returns the application's current directory. - - Use path() to access a TQDir object's path. - - \sa currentDirPath(), TQDir::TQDir() -*/ - -TQDir TQDir::current() -{ - return TQDir( currentDirPath() ); -} - -/*! - Returns the home directory. - - Under Windows the \c HOME environment variable is used. If this - does not exist the \c USERPROFILE environment variable is used. If - that does not exist the path is formed by concatenating the \c - HOMEDRIVE and \c HOMEPATH environment variables. If they don't - exist the rootDirPath() is used (this uses the \c SystemDrive - environment variable). If none of these exist "C:\" is used. - - Under non-Windows operating systems the \c HOME environment - variable is used if it exists, otherwise rootDirPath() is used. - - \sa homeDirPath() -*/ - -TQDir TQDir::home() -{ - return TQDir( homeDirPath() ); -} - -/*! - Returns the root directory. - - \sa rootDirPath() drives() -*/ - -TQDir TQDir::root() -{ - return TQDir( rootDirPath() ); -} - -/*! - \fn TQString TQDir::homeDirPath() - - Returns the absolute path of the user's home directory. - - \sa home() -*/ - -TQValueList<TQRegExp> qt_makeFilterList( const TQString &filter ) -{ - TQValueList<TQRegExp> regExps; - if ( filter.isEmpty() ) - return regExps; - - TQChar sep( ';' ); - int i = filter.find( sep, 0 ); - if ( i == -1 && filter.find( ' ', 0 ) != -1 ) - sep = TQChar( ' ' ); - - TQStringList list = TQStringList::split( sep, filter ); - TQStringList::Iterator it = list.begin(); - while ( it != list.end() ) { - regExps << TQRegExp( (*it).stripWhiteSpace(), CaseSensitiveFS, TRUE ); - ++it; - } - return regExps; -} - -bool qt_matchFilterList( const TQValueList<TQRegExp>& filters, - const TQString &fileName ) -{ - TQValueList<TQRegExp>::ConstIterator rit = filters.begin(); - while ( rit != filters.end() ) { - if ( (*rit).exactMatch(fileName) ) - return TRUE; - ++rit; - } - return FALSE; -} - - -/*! - \overload - - Returns TRUE if the \a fileName matches any of the wildcard (glob) - patterns in the list of \a filters; otherwise returns FALSE. - - (See \link tqregexp.html#wildcard-matching TQRegExp wildcard - matching.\endlink) - \sa TQRegExp::match() -*/ - -bool TQDir::match( const TQStringList &filters, const TQString &fileName ) -{ - TQStringList::ConstIterator sit = filters.begin(); - while ( sit != filters.end() ) { - TQRegExp rx( *sit, CaseSensitiveFS, TRUE ); - if ( rx.exactMatch(fileName) ) - return TRUE; - ++sit; - } - return FALSE; -} - -/*! - Returns TRUE if the \a fileName matches the wildcard (glob) - pattern \a filter; otherwise returns FALSE. The \a filter may - contain multiple patterns separated by spaces or semicolons. - - (See \link tqregexp.html#wildcard-matching TQRegExp wildcard - matching.\endlink) - \sa TQRegExp::match() -*/ - -bool TQDir::match( const TQString &filter, const TQString &fileName ) -{ - return qt_matchFilterList( qt_makeFilterList(filter), fileName ); -} - - -/*! - Removes all multiple directory separators "/" and resolves any - "."s or ".."s found in the path, \a filePath. - - Symbolic links are kept. This function does not return the - canonical path, but rather the simplest version of the input. - For example, "./local" becomes "local", "local/../bin" becomes - "bin" and "/local/usr/../bin" becomes "/local/bin". - - \sa absPath() canonicalPath() -*/ - -TQString TQDir::cleanDirPath( const TQString &filePath ) -{ - TQString name = filePath; - TQString newPath; - - if ( name.isEmpty() ) - return name; - - slashify( name ); - - bool addedSeparator = isRelativePath( name ); - if ( addedSeparator ) - name.insert( 0, '/' ); - - int ePos, pos, upLevel; - - pos = ePos = name.length(); - upLevel = 0; - int len; - - while ( pos && (pos = name.findRev('/', pos - 1)) != -1 ) { - len = ePos - pos - 1; - if ( len == 2 && name.at(pos + 1) == '.' - && name.at(pos + 2) == '.' ) { - upLevel++; - } else { - if ( len != 0 && (len != 1 || name.at(pos + 1) != '.') ) { - if ( !upLevel ) - newPath = TQString::tqfromLatin1("/") - + name.mid(pos + 1, len) + newPath; - else - upLevel--; - } - } - ePos = pos; - } - if ( addedSeparator ) { - while ( upLevel-- ) - newPath.insert( 0, TQString::tqfromLatin1("/..") ); - if ( !newPath.isEmpty() ) - newPath.remove( (uint)0, (uint)1 ); - else - newPath = TQString::tqfromLatin1("."); - } else { - if ( newPath.isEmpty() ) - newPath = TQString::tqfromLatin1("/"); -#if defined(TQ_FS_FAT) || defined(TQ_OS_OS2EMX) - if ( name[0] == '/' ) { - if ( name[1] == '/' ) // "\\machine\x\ ..." - newPath.insert( 0, '/' ); - } else { - newPath = name.left(2) + newPath; - } -#endif - } - return newPath; -} - -int qt_cmp_si_sortSpec; - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif - -#ifdef TQ_OS_TEMP -int __cdecl qt_cmp_si( const void *n1, const void *n2 ) -#else -int qt_cmp_si( const void *n1, const void *n2 ) -#endif -{ - if ( !n1 || !n2 ) - return 0; - - TQDirSortItem* f1 = (TQDirSortItem*)n1; - TQDirSortItem* f2 = (TQDirSortItem*)n2; - - if ( qt_cmp_si_sortSpec & TQDir::DirsFirst ) - if ( f1->item->isDir() != f2->item->isDir() ) - return f1->item->isDir() ? -1 : 1; - - int r = 0; - int sortBy = qt_cmp_si_sortSpec & TQDir::SortByMask; - - switch ( sortBy ) { - case TQDir::Time: - r = f1->item->lastModified().secsTo(f2->item->lastModified()); - break; - case TQDir::Size: - r = f2->item->size() - f1->item->size(); - break; - default: - ; - } - - if ( r == 0 && sortBy != TQDir::Unsorted ) { - // Still not sorted - sort by name - bool ic = qt_cmp_si_sortSpec & TQDir::IgnoreCase; - - if ( f1->filename_cache.isNull() ) - f1->filename_cache = ic ? f1->item->fileName().lower() - : f1->item->fileName(); - if ( f2->filename_cache.isNull() ) - f2->filename_cache = ic ? f2->item->fileName().lower() - : f2->item->fileName(); - - r = qt_cmp_si_sortSpec & TQDir::LocaleAware - ? f1->filename_cache.localeAwareCompare(f2->filename_cache) - : f1->filename_cache.compare(f2->filename_cache); - } - - if ( r == 0 ) { - // Enforce an order - the order the items appear in the array - r = (char*)n1 - (char*)n2; - } - - if ( qt_cmp_si_sortSpec & TQDir::Reversed ) - return -r; - else - return r; -} - -#if defined(TQ_C_CALLBACKS) -} -#endif - -/*! \internal - Detaches all internal data. -*/ -void TQDir::detach() -{ - // deepcopy - dPath = TQDeepCopy<TQString>(dPath); - nameFilt = TQDeepCopy<TQString>(nameFilt); - - if ( fList ) - *fList = TQDeepCopy<TQStringList>( *fList ); - - if ( fiList ) { - TQFileInfoList *newlist = new TQFileInfoList( *fiList ); - delete fiList; - fiList = newlist; - } -} - -#endif // TQT_NO_DIR diff --git a/tqtinterface/qt4/src/tools/tqdir.h b/tqtinterface/qt4/src/tools/tqdir.h deleted file mode 100644 index 864a37e..0000000 --- a/tqtinterface/qt4/src/tools/tqdir.h +++ /dev/null @@ -1,250 +0,0 @@ -/**************************************************************************** -** -** Definition of TQDir class -** -** Created : 950427 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQDIR_H -#define TQDIR_H - -#ifndef TQT_H -#include "tqglobal.h" -#include "tqstrlist.h" -#include "tqfileinfo.h" -#endif // TQT_H - - -#ifndef TQT_NO_DIR -typedef TQPtrList<TQFileInfo> TQFileInfoList; -typedef TQPtrListIterator<TQFileInfo> TQFileInfoListIterator; -class TQStringList; -template <class T> class TQDeepCopy; - - -class TQ_EXPORT TQDir -{ -public: - enum FilterSpec { Dirs = 0x001, - Files = 0x002, - Drives = 0x004, - NoSymLinks = 0x008, - All = 0x007, - TypeMask = 0x00F, - - Readable = 0x010, - Writable = 0x020, - Executable = 0x040, - RWEMask = 0x070, - - Modified = 0x080, - Hidden = 0x100, - System = 0x200, - AccessMask = 0x3F0, - - DefaultFilter = -1 }; - - enum SortSpec { Name = 0x00, - Time = 0x01, - Size = 0x02, - Unsorted = 0x03, - SortByMask = 0x03, - - DirsFirst = 0x04, - Reversed = 0x08, - IgnoreCase = 0x10, - LocaleAware = 0x20, - DefaultSort = -1 }; - - TQDir(); - TQDir( const TQString &path, const TQString &nameFilter = TQString::null, - int sortSpec = Name | IgnoreCase, int filterSpec = All ); - TQDir( const TQDir & ); - - virtual ~TQDir(); - - TQDir &operator=( const TQDir & ); - TQDir &operator=( const TQString &path ); - - virtual void setPath( const TQString &path ); - virtual TQString path() const; - virtual TQString absPath() const; - virtual TQString canonicalPath() const; - - virtual TQString dirName() const; - virtual TQString filePath( const TQString &fileName, - bool acceptAbsPath = TRUE ) const; - virtual TQString absFilePath( const TQString &fileName, - bool acceptAbsPath = TRUE ) const; - - static TQString convertSeparators( const TQString &pathName ); - - virtual bool cd( const TQString &dirName, bool acceptAbsPath = TRUE ); - virtual bool cdUp(); - - TQString nameFilter() const; - virtual void setNameFilter( const TQString &nameFilter ); - FilterSpec filter() const; - virtual void setFilter( int filterSpec ); - SortSpec sorting() const; - virtual void setSorting( int sortSpec ); - - bool matchAllDirs() const; - virtual void setMatchAllDirs( bool ); - - uint count() const; - TQString operator[]( int ) const; - - virtual TQStrList encodedEntryList( int filterSpec = DefaultFilter, - int sortSpec = DefaultSort ) const; - virtual TQStrList encodedEntryList( const TQString &nameFilter, - int filterSpec = DefaultFilter, - int sortSpec = DefaultSort ) const; - virtual TQStringList entryList( int filterSpec = DefaultFilter, - int sortSpec = DefaultSort ) const; - virtual TQStringList entryList( const TQString &nameFilter, - int filterSpec = DefaultFilter, - int sortSpec = DefaultSort ) const; - - virtual const TQFileInfoList *entryInfoList( int filterSpec = DefaultFilter, - int sortSpec = DefaultSort ) const; - virtual const TQFileInfoList *entryInfoList( const TQString &nameFilter, - int filterSpec = DefaultFilter, - int sortSpec = DefaultSort ) const; - - static const TQFileInfoList *drives(); - - virtual bool mkdir( const TQString &dirName, - bool acceptAbsPath = TRUE ) const; - virtual bool rmdir( const TQString &dirName, - bool acceptAbsPath = TRUE ) const; - - virtual bool isReadable() const; - virtual bool exists() const; - virtual bool isRoot() const; - - virtual bool isRelative() const; - virtual void convertToAbs(); - - virtual bool operator==( const TQDir & ) const; - virtual bool operator!=( const TQDir & ) const; - - virtual bool remove( const TQString &fileName, - bool acceptAbsPath = TRUE ); - virtual bool rename( const TQString &name, const TQString &newName, - bool acceptAbsPaths = TRUE ); - virtual bool exists( const TQString &name, - bool acceptAbsPath = TRUE ); - - static char separator(); - - static bool setCurrent( const TQString &path ); - static TQDir current(); - static TQDir home(); - static TQDir root(); - static TQString currentDirPath(); - static TQString homeDirPath(); - static TQString rootDirPath(); - - static bool match( const TQStringList &filters, const TQString &fileName ); - static bool match( const TQString &filter, const TQString &fileName ); - static TQString cleanDirPath( const TQString &dirPath ); - static bool isRelativePath( const TQString &path ); - void refresh() const; - -private: -#ifdef TQ_OS_MAC - typedef struct FSSpec FSSpec; - static FSSpec *make_spec(const TQString &); -#endif - void init(); - virtual bool readDirEntries( const TQString &nameFilter, - int FilterSpec, int SortSpec ); - - static void slashify( TQString & ); - - TQString dPath; - TQStringList *fList; - TQFileInfoList *fiList; - TQString nameFilt; - FilterSpec filtS; - SortSpec sortS; - uint dirty : 1; - uint allDirs : 1; - - void detach(); - friend class TQDeepCopy< TQDir >; -}; - - -inline TQString TQDir::path() const -{ - return dPath; -} - -inline TQString TQDir::nameFilter() const -{ - return nameFilt; -} - -inline TQDir::FilterSpec TQDir::filter() const -{ - return filtS; -} - -inline TQDir::SortSpec TQDir::sorting() const -{ - return sortS; -} - -inline bool TQDir::matchAllDirs() const -{ - return allDirs; -} - -inline bool TQDir::operator!=( const TQDir &d ) const -{ - return !(*this == d); -} - - -struct TQDirSortItem { - TQString filename_cache; - TQFileInfo* item; -}; - -#endif // TQT_NO_DIR -#endif // TQDIR_H diff --git a/tqtinterface/qt4/src/tools/tqdir_p.h b/tqtinterface/qt4/src/tools/tqdir_p.h deleted file mode 100644 index 802771a..0000000 --- a/tqtinterface/qt4/src/tools/tqdir_p.h +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** -** -** Definition of some private TQDir functions. -** -** Created : 001106 -** -** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQDIR_P_H -#define TQDIR_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of qdir.cpp and qdir_*.cpp. -// This header file may change from version to version without notice, -// or even be removed. -// -// We mean it. -// -// - -#ifndef TQT_H -#include "tqregexp.h" -#include "tqvaluelist.h" -#endif // TQT_H - -extern TQValueList<TQRegExp> qt_makeFilterList( const TQString & ); -extern bool qt_matchFilterList( const TQValueList<TQRegExp> &, const TQString & ); - -extern int qt_cmp_si_sortSpec; - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif - -#ifdef TQ_OS_TEMP -extern int __cdecl qt_cmp_si( const void *, const void * ); -#else -extern int qt_cmp_si( const void *, const void * ); -#endif - -#if defined(TQ_C_CALLBACKS) -} -#endif - - -#endif // TQDIR_P_H diff --git a/tqtinterface/qt4/src/tools/tqdir_unix.cpp b/tqtinterface/qt4/src/tools/tqdir_unix.cpp deleted file mode 100644 index f96808b..0000000 --- a/tqtinterface/qt4/src/tools/tqdir_unix.cpp +++ /dev/null @@ -1,325 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQDir class -** -** Created : 950628 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" -#include "tqdir.h" - -#ifndef TQT_NO_DIR - -#include "tqdir_p.h" -#include "tqfileinfo.h" -#include "tqregexp.h" -#include "tqstringlist.h" - -#ifdef TQT_THREAD_SUPPORT -# include <private/tqmutexpool_p.h> -#endif // TQT_THREAD_SUPPORT - -#include <stdlib.h> -#include <limits.h> -#include <errno.h> - - -void TQDir::slashify( TQString& ) -{ -} - -TQString TQDir::homeDirPath() -{ - TQString d; - d = TQFile::decodeName(getenv("HOME")); - slashify( d ); - if ( d.isNull() ) - d = rootDirPath(); - return d; -} - -TQString TQDir::canonicalPath() const -{ - TQString r; -#if defined(__GLIBC__) && !defined(PATH_MAX) - char *cur = ::get_current_dir_name(); - if ( cur ) { - char *tmp = canonicalize_file_name( TQFile::encodeName( dPath ).data() ); - if ( tmp ) { - r = TQFile::decodeName( tmp ); - free( tmp ); - } - slashify( r ); - // always make sure we go back to the current dir - ::chdir( cur ); - free( cur ); - } -#else - char cur[PATH_MAX+1]; - if ( ::getcwd( cur, PATH_MAX ) ) { - char tmp[PATH_MAX+1]; - // need the cast for old solaris versions of realpath that doesn't take - // a const char*. - if( ::realpath( (char*)TQFile::encodeName( dPath ).data(), tmp ) ) - r = TQFile::decodeName( tmp ); - slashify( r ); - - // always make sure we go back to the current dir - ::chdir( cur ); - } -#endif /* __GLIBC__ && !PATH_MAX */ - return r; -} - -bool TQDir::mkdir( const TQString &dirName, bool acceptAbsPath ) const -{ -#if defined(TQ_OS_MACX) // Mac X doesn't support trailing /'s - TQString name = dirName; - if (dirName[dirName.length() - 1] == "/") - name = dirName.left( dirName.length() - 1 ); - int status = - ::mkdir( TQFile::encodeName(filePath(name,acceptAbsPath)), 0777 ); -#else - int status = - ::mkdir( TQFile::encodeName(filePath(dirName,acceptAbsPath)), 0777 ); -#endif - return status == 0; -} - -bool TQDir::rmdir( const TQString &dirName, bool acceptAbsPath ) const -{ - return ::rmdir( TQFile::encodeName(filePath(dirName,acceptAbsPath)) ) == 0; -} - -bool TQDir::isReadable() const -{ - return ::access( TQFile::encodeName(dPath), R_OK | X_OK ) == 0; -} - -bool TQDir::isRoot() const -{ - return dPath == TQString::tqfromLatin1("/"); -} - -bool TQDir::rename( const TQString &name, const TQString &newName, - bool acceptAbsPaths ) -{ - if ( name.isEmpty() || newName.isEmpty() ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQDir::rename: Empty or null file name(s)" ); -#endif - return FALSE; - } - TQString fn1 = filePath( name, acceptAbsPaths ); - TQString fn2 = filePath( newName, acceptAbsPaths ); - return ::rename( TQFile::encodeName(fn1), - TQFile::encodeName(fn2) ) == 0; -} - -bool TQDir::setCurrent( const TQString &path ) -{ - int r; - r = ::chdir( TQFile::encodeName(path) ); - return r >= 0; -} - -TQString TQDir::currentDirPath() -{ - TQString result; - - struct stat st; - if ( ::stat( ".", &st ) == 0 ) { -#if defined(__GLIBC__) && !defined(PATH_MAX) - char *currentName = ::get_current_dir_name(); - if ( currentName ) { - result = TQFile::decodeName(currentName); - free( currentName ); - } -#else - char currentName[PATH_MAX+1]; - if ( ::getcwd( currentName, PATH_MAX ) ) - result = TQFile::decodeName(currentName); -#endif /* __GLIBC__ && !PATH_MAX */ -#if defined(TQT_DEBUG) - if ( result.isNull() ) - qWarning( "TQDir::currentDirPath: getcwd() failed" ); -#endif - } else { -#if defined(TQT_DEBUG) - qWarning( "TQDir::currentDirPath: stat(\".\") failed" ); -#endif - } - slashify( result ); - return result; -} - -TQString TQDir::rootDirPath() -{ - TQString d = TQString::tqfromLatin1( "/" ); - return d; -} - -bool TQDir::isRelativePath( const TQString &path ) -{ - int len = path.length(); - if ( len == 0 ) - return TRUE; - return path[0] != '/'; -} - -bool TQDir::readDirEntries( const TQString &nameFilter, - int filterSpec, int sortSpec ) -{ - int i; - if ( !fList ) { - fList = new TQStringList; - TQ_CHECK_PTR( fList ); - fiList = new TQFileInfoList; - TQ_CHECK_PTR( fiList ); - fiList->setAutoDelete( TRUE ); - } else { - fList->clear(); - fiList->clear(); - } - - TQValueList<TQRegExp> filters = qt_makeFilterList( nameFilter ); - - bool doDirs = (filterSpec & Dirs) != 0; - bool doFiles = (filterSpec & Files) != 0; - bool noSymLinks = (filterSpec & NoSymLinks) != 0; - bool doReadable = (filterSpec & Readable) != 0; - bool doWritable = (filterSpec & Writable) != 0; - bool doExecable = (filterSpec & Executable) != 0; - bool doHidden = (filterSpec & Hidden) != 0; - bool doSystem = (filterSpec & System) != 0; - - TQFileInfo fi; - DIR *dir; - dirent *file; - - dir = opendir( TQFile::encodeName(dPath) ); - if ( !dir ) - return FALSE; // cannot read the directory - -#if defined(TQT_THREAD_SUPPORT) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(TQ_OS_CYGWIN) - union { - struct dirent mt_file; - char b[sizeof(struct dirent) + MAXNAMLEN + 1]; - } u; - while ( readdir_r(dir, &u.mt_file, &file ) == 0 && file ) -#else - while ( (file = readdir(dir)) ) -#endif // TQT_THREAD_SUPPORT && _POSIX_THREAD_SAFE_FUNCTIONS - { - TQString fn = TQFile::decodeName(file->d_name); - fi.setFile( *this, fn ); - if ( !qt_matchFilterList(filters, fn) && !(allDirs && fi.isDir()) ) - continue; - if ( (doDirs && fi.isDir()) || (doFiles && fi.isFile()) || - (doSystem && (!fi.isFile() && !fi.isDir())) ) { - if ( noSymLinks && fi.isSymLink() ) - continue; - if ( (filterSpec & RWEMask) != 0 ) - if ( (doReadable && !fi.isReadable()) || - (doWritable && !fi.isWritable()) || - (doExecable && !fi.isExecutable()) ) - continue; - if ( !doHidden && fn[0] == '.' && - fn != TQString::tqfromLatin1(".") - && fn != TQString::tqfromLatin1("..") ) - continue; - fiList->append( new TQFileInfo( fi ) ); - } - } - if ( closedir(dir) != 0 ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQDir::readDirEntries: Cannot close the directory: %s", - dPath.local8Bit().data() ); -#endif - } - - // Sort... - if(fiList->count()) { - TQDirSortItem* si= new TQDirSortItem[fiList->count()]; - TQFileInfo* itm; - i=0; - for (itm = fiList->first(); itm; itm = fiList->next()) - si[i++].item = itm; - qt_cmp_si_sortSpec = sortSpec; - qsort( si, i, sizeof(si[0]), qt_cmp_si ); - // put them back in the list - fiList->setAutoDelete( FALSE ); - fiList->clear(); - int j; - for ( j=0; j<i; j++ ) { - fiList->append( si[j].item ); - fList->append( si[j].item->fileName() ); - } - delete [] si; - fiList->setAutoDelete( TRUE ); - } - - if ( filterSpec == (FilterSpec)filtS && sortSpec == (SortSpec)sortS && - nameFilter == nameFilt ) - dirty = FALSE; - else - dirty = TRUE; - return TRUE; -} - -const TQFileInfoList * TQDir::drives() -{ - // at most one instance of TQFileInfoList is leaked, and this variable - // points to that list - static TQFileInfoList * knownMemoryLeak = 0; - - if ( !knownMemoryLeak ) { - -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker locker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &knownMemoryLeak ) : 0 ); -#endif // TQT_THREAD_SUPPORT - - if ( !knownMemoryLeak ) { - knownMemoryLeak = new TQFileInfoList; - // non-win32 versions both use just one root directory - knownMemoryLeak->append( new TQFileInfo( rootDirPath() ) ); - } - } - - return knownMemoryLeak; -} -#endif //TQT_NO_DIR diff --git a/tqtinterface/qt4/src/tools/tqfeatures.h b/tqtinterface/qt4/src/tools/tqfeatures.h deleted file mode 100644 index dfafe61..0000000 --- a/tqtinterface/qt4/src/tools/tqfeatures.h +++ /dev/null @@ -1,994 +0,0 @@ -// All feature and their dependencies -// -// This list is generated from $TQTDIR/src/tools/qfeatures.txt -// -// Asynchronous I/O -//#define TQT_NO_ASYNC_IO - -// Bezier curves -//#define TQT_NO_BEZIER - -// Buttons -//#define TQT_NO_BUTTON - -// Named colors -//#define TQT_NO_COLORNAMES - -// Cursors -//#define TQT_NO_CURSOR - -// TQDataStream -//#define TQT_NO_DATASTREAM - -// TQDate/TQTime/TQDateTime toString() and fromString() -//#define TQT_NO_DATESTRING - -// Dialogs -//#define TQT_NO_DIALOG - -// TQDirectPainter -//#define TQT_NO_DIRECTPAINTER - -// Special widget effects (fading, scrolling) -//#define TQT_NO_EFFECTS - -// Freetype font engine -//#define TQT_NO_FREETYPE - -// Dither TQImage to 1-bit image -//#define TQT_NO_IMAGE_DITHER_TO_1 - -// TQImage::createHeuristicMask() -//#define TQT_NO_IMAGE_HEURISTIC_MASK - -// TQImage mirroring -//#define TQT_NO_IMAGE_MIRROR - -// Smooth TQImage scaling -//#define TQT_NO_IMAGE_SMOOTHSCALE - -// TrueColor TQImage -//#define TQT_NO_IMAGE_TRUECOLOR - -// Automatic widget tqlayout -//#define TQT_NO_LAYOUT - -// Networking -//#define TQT_NO_NETWORK - -// Palettes -//#define TQT_NO_PALETTE - -// Alpha-blended cursor -//#define TQT_NO_TQWS_ALPHA_CURSOR - -// 1-bit monochrome -//#define TQT_NO_TQWS_DEPTH_1 - -// 15 or 16-bit color -//#define TQT_NO_TQWS_DEPTH_16 - -// 24-bit color -//#define TQT_NO_TQWS_DEPTH_24 - -// 32-bit color -//#define TQT_NO_TQWS_DEPTH_32 - -// 4-bit grayscale -//#define TQT_NO_TQWS_DEPTH_4 - -// 8-bit color -//#define TQT_NO_TQWS_DEPTH_8 - -// 8-bit grayscale -//#define TQT_NO_TQWS_DEPTH_8GRAYSCALE - -// Favour code size over graphics speed -//#define TQT_NO_TQWS_GFX_SPEED - -// Console keyboard -//#define TQT_NO_TQWS_KEYBOARD - -// Linux framebuffer -//#define TQT_NO_TQWS_LINUXFB - -// Mach64 acceleration -//#define TQT_NO_TQWS_MACH64 - -// Window Manager -//#define TQT_NO_TQWS_MANAGER - -// Matrox MGA acceleration -//#define TQT_NO_TQWS_MATROX - -// Autodetecting mouse driver -//#define TQT_NO_TQWS_MOUSE_AUTO - -// Non-autodetecting mouse driver -//#define TQT_NO_TQWS_MOUSE_MANUAL - -// TQt/Embedded window system properties. -//#define TQT_NO_TQWS_PROPERTIES - -// Repeater display -//#define TQT_NO_TQWS_REPEATER - -// Saving of fonts -//#define TQT_NO_TQWS_SAVEFONTS - -// Shadow frame buffer -//#define TQT_NO_TQWS_SHADOWFB - -// Virtual frame buffer -//#define TQT_NO_TQWS_VFB - -// 4-bit VGA -//#define TQT_NO_TQWS_VGA_16 - -// Voodoo3 acceleration -//#define TQT_NO_TQWS_VOODOO3 - -// Range-control widgets -//#define TQT_NO_RANGECONTROL - -// Regular expression capture -//#define TQT_NO_REGEXP - -// TQSignalMapper -//#define TQT_NO_SIGNALMAPPER - -// Playing sounds -//#define TQT_NO_SOUND - -// Standard template library compatiblity -//#define TQT_NO_STL - -// TQStringList -//#define TQT_NO_STRINGLIST - -// Character set conversions -//#define TQT_NO_TEXTCODEC - -// TQTextStream -//#define TQT_NO_TEXTSTREAM - -// Unicode property tables -//#define TQT_NO_UNICODETABLES - -// Input validators -//#define TQT_NO_VALIDATOR - -// TQVariant -//#define TQT_NO_VARIANT - -// Wheel-mouse events -//#define TQT_NO_WHEELEVENT - -// TQWMatrix -//#define TQT_NO_WMATRIX - -// Non-Unicode text conversions -#if !defined(TQT_NO_CODECS) && (defined(TQT_NO_TEXTCODEC)) -#define TQT_NO_CODECS -#endif - -// TQCop IPC -#if !defined(TQT_NO_COP) && (defined(TQT_NO_DATASTREAM)) -#define TQT_NO_COP -#endif - -// TQFontDatabase -#if !defined(TQT_NO_FONTDATABASE) && (defined(TQT_NO_STRINGLIST)) -#define TQT_NO_FONTDATABASE -#endif - -// Image formats -#if !defined(TQT_NO_IMAGEIO) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_IMAGEIO -#endif - -// 16-bit TQImage -#if !defined(TQT_NO_IMAGE_16_BIT) && (defined(TQT_NO_IMAGE_TRUECOLOR)) -#define TQT_NO_IMAGE_16_BIT -#endif - -// Image file text strings -#if !defined(TQT_NO_IMAGE_TEXT) && (defined(TQT_NO_STRINGLIST)) -#define TQT_NO_IMAGE_TEXT -#endif - -// Shared library wrapper -#if !defined(TQT_NO_LIBRARY) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_LIBRARY -#endif - -// Pixmap transformations -#if !defined(TQT_NO_PIXMAP_TRANSFORMATION) && (defined(TQT_NO_WMATRIX)) -#define TQT_NO_PIXMAP_TRANSFORMATION -#endif - -// Convert UUID to/from string -#if !defined(TQT_NO_TQUUID_STRING) && (defined(TQT_NO_STRINGLIST)) -#define TQT_NO_TQUUID_STRING -#endif - -// The "BeOS" style -#if !defined(TQT_NO_TQWS_BEOS_WM_STYLE) && (defined(TQT_NO_TQWS_MANAGER)) -#define TQT_NO_TQWS_BEOS_WM_STYLE -#endif - -// Visible cursor -#if !defined(TQT_NO_TQWS_CURSOR) && (defined(TQT_NO_CURSOR)) -#define TQT_NO_TQWS_CURSOR -#endif - -// 32-bit color, BGR order -#if !defined(TQT_NO_TQWS_DEPTH_32_BGR) && (defined(TQT_NO_TQWS_DEPTH_32)) -#define TQT_NO_TQWS_DEPTH_32_BGR -#endif - -// The "Hydro" style -#if !defined(TQT_NO_TQWS_HYDRO_WM_STYLE) && (defined(TQT_NO_TQWS_MANAGER)) -#define TQT_NO_TQWS_HYDRO_WM_STYLE -#endif - -// Keyboard for SHARP Zaurus SL5xxx tqdevices -#if !defined(TQT_NO_TQWS_KBD_SHARP) && (defined(TQT_NO_TQWS_KEYBOARD)) -#define TQT_NO_TQWS_KBD_SHARP -#endif - -// The "KDE2" style -#if !defined(TQT_NO_TQWS_KDE2_WM_STYLE) && (defined(TQT_NO_TQWS_MANAGER)) -#define TQT_NO_TQWS_KDE2_WM_STYLE -#endif - -// The "KDE" style -#if !defined(TQT_NO_TQWS_KDE_WM_STYLE) && (defined(TQT_NO_TQWS_MANAGER)) -#define TQT_NO_TQWS_KDE_WM_STYLE -#endif - -// Multi-process architecture -#if !defined(TQT_NO_TQWS_MULTIPROCESS) && (defined(TQT_NO_NETWORK)) -#define TQT_NO_TQWS_MULTIPROCESS -#endif - -// Transformed frame buffer -#if !defined(TQT_NO_TQWS_TRANSFORMED) && (defined(TQT_NO_TQWS_LINUXFB)) -#define TQT_NO_TQWS_TRANSFORMED -#endif - -// Remote frame buffer (VNC) -#if !defined(TQT_NO_TQWS_VNC) && (defined(TQT_NO_NETWORK)) -#define TQT_NO_TQWS_VNC -#endif - -// The "Windows" style -#if !defined(TQT_NO_TQWS_WINDOWS_WM_STYLE) && (defined(TQT_NO_TQWS_MANAGER)) -#define TQT_NO_TQWS_WINDOWS_WM_STYLE -#endif - -// Regular expression anchors -#if !defined(TQT_NO_REGEXP_ANCHOR_ALT) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_REGEXP_ANCHOR_ALT -#endif - -// Regular expression back-reference -#if !defined(TQT_NO_REGEXP_BACKREF) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_REGEXP_BACKREF -#endif - -// Regular expression character-class -#if !defined(TQT_NO_REGEXP_CCLASS) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_REGEXP_CCLASS -#endif - -// Regular expression escape -#if !defined(TQT_NO_REGEXP_ESCAPE) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_REGEXP_ESCAPE -#endif - -// Regular expression interval -#if !defined(TQT_NO_REGEXP_INTERVAL) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_REGEXP_INTERVAL -#endif - -// Regular expression lookahead -#if !defined(TQT_NO_REGEXP_LOOKAHEAD) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_REGEXP_LOOKAHEAD -#endif - -// Regular expression optimization -#if !defined(TQT_NO_REGEXP_OPTIM) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_REGEXP_OPTIM -#endif - -// Regular expression wildcard -#if !defined(TQT_NO_REGEXP_WILDCARD) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_REGEXP_WILDCARD -#endif - -// Semi-modal dialogs -#if !defined(TQT_NO_SEMIMODAL) && (defined(TQT_NO_DIALOG)) -#define TQT_NO_SEMIMODAL -#endif - -// Session management -#if !defined(TQT_NO_SESSIONMANAGER) && (defined(TQT_NO_STRINGLIST)) -#define TQT_NO_SESSIONMANAGER -#endif - -// TQString::sprintf() -#if !defined(TQT_NO_SPRINTF) && (defined(TQT_NO_REGEXP)) -#define TQT_NO_SPRINTF -#endif - -// Scaling and rotation -#if !defined(TQT_NO_TRANSFORMATIONS) && (defined(TQT_NO_WMATRIX)) -#define TQT_NO_TRANSFORMATIONS -#endif - -// Translations via TQObject::tr() -#if !defined(TQT_NO_TRANSLATION) && (defined(TQT_NO_DATASTREAM)) -#define TQT_NO_TRANSLATION -#endif - -// Window icon and caption -#if !defined(TQT_NO_WIDGET_TOPEXTRA) && (defined(TQT_NO_IMAGE_HEURISTIC_MASK)) -#define TQT_NO_WIDGET_TOPEXTRA -#endif - -// Keyboard accelerators and shortcuts -#if !defined(TQT_NO_ACCEL) && (defined(TQT_NO_SPRINTF)) -#define TQT_NO_ACCEL -#endif - -// Asynchronous image I/O -#if !defined(TQT_NO_ASYNC_IMAGE_IO) && (defined(TQT_NO_IMAGEIO)) -#define TQT_NO_ASYNC_IMAGE_IO -#endif - -// BDF font files -#if !defined(TQT_NO_BDF) && (defined(TQT_NO_TEXTSTREAM) || defined(TQT_NO_STRINGLIST)) -#define TQT_NO_BDF -#endif - -// TQDir -#if !defined(TQT_NO_DIR) && (defined(TQT_NO_STRINGLIST) || defined(TQT_NO_REGEXP)) -#define TQT_NO_DIR -#endif - -// JPEG image I/O -#if !defined(TQT_NO_IMAGEIO_JPEG) && (defined(TQT_NO_IMAGEIO)) -#define TQT_NO_IMAGEIO_JPEG -#endif - -// MNG image I/O -#if !defined(TQT_NO_IMAGEIO_MNG) && (defined(TQT_NO_IMAGEIO)) -#define TQT_NO_IMAGEIO_MNG -#endif - -// PNG image I/O -#if !defined(TQT_NO_IMAGEIO_PNG) && (defined(TQT_NO_IMAGEIO)) -#define TQT_NO_IMAGEIO_PNG -#endif - -// PPM image I/O -#if !defined(TQT_NO_IMAGEIO_PPM) && (defined(TQT_NO_IMAGEIO)) -#define TQT_NO_IMAGEIO_PPM -#endif - -// XBM image I/O -#if !defined(TQT_NO_IMAGEIO_XBM) && (defined(TQT_NO_IMAGEIO)) -#define TQT_NO_IMAGEIO_XBM -#endif - -// Image transformations -#if !defined(TQT_NO_IMAGE_TRANSFORMATION) && (defined(TQT_NO_PIXMAP_TRANSFORMATION)) -#define TQT_NO_IMAGE_TRANSFORMATION -#endif - -// External process invocation. -#if !defined(TQT_NO_PROCESS) && (defined(TQT_NO_STRINGLIST) || defined(TQT_NO_REGEXP)) -#define TQT_NO_PROCESS -#endif - -// Regular expression capture -#if !defined(TQT_NO_REGEXP_CAPTURE) && (defined(TQT_NO_REGEXP) || defined(TQT_NO_STRINGLIST)) -#define TQT_NO_REGEXP_CAPTURE -#endif - -// Splash screen widget -#if !defined(TQT_NO_SPLASHSCREEN) && (defined(TQT_NO_IMAGEIO)) -#define TQT_NO_SPLASHSCREEN -#endif - -// Template classes in TQVariant -#if !defined(TQT_NO_TEMPLATE_VARIANT) && (defined(TQT_NO_VARIANT) || defined(TQT_NO_STRINGLIST)) -#define TQT_NO_TEMPLATE_VARIANT -#endif - -// Month and day names in dates -#if !defined(TQT_NO_TEXTDATE) && (defined(TQT_NO_STRINGLIST) || defined(TQT_NO_DATESTRING)) -#define TQT_NO_TEXTDATE -#endif - -// Drawing utility functions -#if !defined(TQT_NO_DRAWUTIL) && (defined(TQT_NO_SPRINTF) || defined(TQT_NO_PALETTE)) -#define TQT_NO_DRAWUTIL -#endif - -// BMP image I/O -#if !defined(TQT_NO_IMAGEIO_BMP) && (defined(TQT_NO_IMAGEIO) || defined(TQT_NO_DATASTREAM)) -#define TQT_NO_IMAGEIO_BMP -#endif - -// TQPicture -#if !defined(TQT_NO_PICTURE) && (defined(TQT_NO_DATASTREAM) || defined(TQT_NO_IMAGEIO)) -#define TQT_NO_PICTURE -#endif - -// Translations via TQObject::trUtf8() -#if !defined(TQT_NO_TRANSLATION_UTF8) && (defined(TQT_NO_TRANSLATION) || defined(TQT_NO_TEXTCODEC)) -#define TQT_NO_TRANSLATION_UTF8 -#endif - -// URL parser -#if !defined(TQT_NO_URL) && (defined(TQT_NO_DIR)) -#define TQT_NO_URL -#endif - -// Animated images -#if !defined(TQT_NO_MOVIE) && (defined(TQT_NO_ASYNC_IO) || defined(TQT_NO_ASYNC_IMAGE_IO)) -#define TQT_NO_MOVIE -#endif - -// TQStyle -#if !defined(TQT_NO_STYLE) && (defined(TQT_NO_DRAWUTIL)) -#define TQT_NO_STYLE -#endif - -// DNS -#if !defined(TQT_NO_DNS) && (defined(TQT_NO_NETWORK) || defined(TQT_NO_STRINGLIST) || defined(TQT_NO_TEXTSTREAM) || defined(TQT_NO_SPRINTF)) -#define TQT_NO_DNS -#endif - -// Framed widgets -#if !defined(TQT_NO_FRAME) && (defined(TQT_NO_STYLE)) -#define TQT_NO_FRAME -#endif - -// TQIconSet -#if !defined(TQT_NO_ICONSET) && (defined(TQT_NO_IMAGEIO) || defined(TQT_NO_IMAGE_SMOOTHSCALE) || defined(TQT_NO_PALETTE) || defined(TQT_NO_IMAGE_HEURISTIC_MASK)) -#define TQT_NO_ICONSET -#endif - -// XPM image I/O -#if !defined(TQT_NO_IMAGEIO_XPM) && (defined(TQT_NO_IMAGEIO) || defined(TQT_NO_SPRINTF) || defined(TQT_NO_TEXTSTREAM)) -#define TQT_NO_IMAGEIO_XPM -#endif - -// Network file access -#if !defined(TQT_NO_NETWORKPROTOCOL) && (defined(TQT_NO_TEXTCODEC) || defined(TQT_NO_URL)) -#define TQT_NO_NETWORKPROTOCOL -#endif - -// TQSizeGrip -#if !defined(TQT_NO_SIZEGRIP) && (defined(TQT_NO_STYLE)) -#define TQT_NO_SIZEGRIP -#endif - -// Motif style -#if !defined(TQT_NO_STYLE_MOTIF) && (defined(TQT_NO_STYLE)) -#define TQT_NO_STYLE_MOTIF -#endif - -// Windows style -#if !defined(TQT_NO_STYLE_WINDOWS) && (defined(TQT_NO_STYLE)) -#define TQT_NO_STYLE_WINDOWS -#endif - -// Internal titlebar widget -#if !defined(TQT_NO_TITLEBAR) && (defined(TQT_NO_STYLE)) -#define TQT_NO_TITLEBAR -#endif - -// XML -#if !defined(TQT_NO_XML) && (defined(TQT_NO_TEXTSTREAM) || defined(TQT_NO_TEXTCODEC) || defined(TQT_NO_REGEXP_CAPTURE)) -#define TQT_NO_XML -#endif - -// Check-boxes -#if !defined(TQT_NO_CHECKBOX) && (defined(TQT_NO_BUTTON) || defined(TQT_NO_STYLE)) -#define TQT_NO_CHECKBOX -#endif - -// Dials -#if !defined(TQT_NO_DIAL) && (defined(TQT_NO_RANGECONTROL) || defined(TQT_NO_STYLE)) -#define TQT_NO_DIAL -#endif - -// TQLabel -#if !defined(TQT_NO_LABEL) && (defined(TQT_NO_FRAME)) -#define TQT_NO_LABEL -#endif - -// TQLCDNumber -#if !defined(TQT_NO_LCDNUMBER) && (defined(TQT_NO_FRAME)) -#define TQT_NO_LCDNUMBER -#endif - -// Single-line edits -#if !defined(TQT_NO_LINEEDIT) && (defined(TQT_NO_FRAME)) -#define TQT_NO_LINEEDIT -#endif - -// MIME -#if !defined(TQT_NO_MIME) && (defined(TQT_NO_DIR) || defined(TQT_NO_IMAGEIO) || defined(TQT_NO_TEXTCODEC)) -#define TQT_NO_MIME -#endif - -// Progress bars -#if !defined(TQT_NO_PROGRESSBAR) && (defined(TQT_NO_FRAME)) -#define TQT_NO_PROGRESSBAR -#endif - -// Push-buttons -#if !defined(TQT_NO_PUSHBUTTON) && (defined(TQT_NO_BUTTON) || defined(TQT_NO_STYLE)) -#define TQT_NO_PUSHBUTTON -#endif - -// Radio-buttons -#if !defined(TQT_NO_RADIOBUTTON) && (defined(TQT_NO_BUTTON) || defined(TQT_NO_STYLE)) -#define TQT_NO_RADIOBUTTON -#endif - -// Internal resize handler -#if !defined(TQT_NO_RESIZEHANDLER) && (defined(TQT_NO_FRAME)) -#define TQT_NO_RESIZEHANDLER -#endif - -// Scroll bars -#if !defined(TQT_NO_SCROLLBAR) && (defined(TQT_NO_RANGECONTROL) || defined(TQT_NO_STYLE)) -#define TQT_NO_SCROLLBAR -#endif - -// Sliders -#if !defined(TQT_NO_SLIDER) && (defined(TQT_NO_RANGECONTROL) || defined(TQT_NO_STYLE)) -#define TQT_NO_SLIDER -#endif - -// Spinbox control widget -#if !defined(TQT_NO_SPINWIDGET) && (defined(TQT_NO_FRAME)) -#define TQT_NO_SPINWIDGET -#endif - -// tqStatus bars -#if !defined(TQT_NO_STATUSBAR) && (defined(TQT_NO_LAYOUT) || defined(TQT_NO_STYLE)) -#define TQT_NO_STATUSBAR -#endif - -// Compact Windows style -#if !defined(TQT_NO_STYLE_COMPACT) && (defined(TQT_NO_STYLE_WINDOWS)) -#define TQT_NO_STYLE_COMPACT -#endif - -// Interlace-friendly style -#if !defined(TQT_NO_STYLE_INTERLACE) && (defined(TQT_NO_STYLE_MOTIF)) -#define TQT_NO_STYLE_INTERLACE -#endif - -// Platinum style -#if !defined(TQT_NO_STYLE_PLATINUM) && (defined(TQT_NO_STYLE_WINDOWS)) -#define TQT_NO_STYLE_PLATINUM -#endif - -// Widget stacks -#if !defined(TQT_NO_WIDGETSTACK) && (defined(TQT_NO_FRAME)) -#define TQT_NO_WIDGETSTACK -#endif - -// Grid tqlayout widgets -#if !defined(TQT_NO_GRID) && (defined(TQT_NO_LAYOUT) || defined(TQT_NO_FRAME)) -#define TQT_NO_GRID -#endif - -// Group boxes -#if !defined(TQT_NO_GROUPBOX) && (defined(TQT_NO_FRAME) || defined(TQT_NO_LAYOUT)) -#define TQT_NO_GROUPBOX -#endif - -// Horizontal box tqlayout widgets -#if !defined(TQT_NO_HBOX) && (defined(TQT_NO_LAYOUT) || defined(TQT_NO_FRAME)) -#define TQT_NO_HBOX -#endif - -// Menu-oriented widgets -#if !defined(TQT_NO_MENUDATA) && (defined(TQT_NO_ICONSET) || defined(TQT_NO_VARIANT)) -#define TQT_NO_MENUDATA -#endif - -// Persistent application settings -#if !defined(TQT_NO_SETTINGS) && (defined(TQT_NO_DIR) || defined(TQT_NO_TEXTSTREAM) || defined(TQT_NO_REGEXP_CAPTURE)) -#define TQT_NO_SETTINGS -#endif - -// Splitters -#if !defined(TQT_NO_SPLITTER) && (defined(TQT_NO_FRAME) || defined(TQT_NO_LAYOUT)) -#define TQT_NO_SPLITTER -#endif - -// Table-like widgets -#if !defined(TQT_NO_TABLEVIEW) && (defined(TQT_NO_SCROLLBAR)) -#define TQT_NO_TABLEVIEW -#endif - -// Tool tips -#if !defined(TQT_NO_TOOLTIP) && (defined(TQT_NO_LABEL)) -#define TQT_NO_TOOLTIP -#endif - -// Cut and paste -#if !defined(TQT_NO_CLIPBOARD) && (defined(TQT_NO_TQWS_PROPERTIES) || defined(TQT_NO_MIME)) -#define TQT_NO_CLIPBOARD -#endif - -// Horizontal group boxes -#if !defined(TQT_NO_HGROUPBOX) && (defined(TQT_NO_GROUPBOX)) -#define TQT_NO_HGROUPBOX -#endif - -// Properties -#if !defined(TQT_NO_PROPERTIES) && (defined(TQT_NO_VARIANT) || defined(TQT_NO_STRINGLIST) || defined(TQT_NO_ICONSET)) -#define TQT_NO_PROPERTIES -#endif - -// RichText (HTML) display -#if !defined(TQT_NO_RICHTEXT) && (defined(TQT_NO_STYLE) || defined(TQT_NO_LAYOUT) || defined(TQT_NO_STRINGLIST) || defined(TQT_NO_TEXTSTREAM)) -#define TQT_NO_RICHTEXT -#endif - -// SQL classes -#if !defined(TQT_NO_SQL) && (defined(TQT_NO_STRINGLIST) || defined(TQT_NO_REGEXP_CAPTURE) || defined(TQT_NO_VARIANT) || defined(TQT_NO_SPRINTF) || defined(TQT_NO_DATESTRING)) -#define TQT_NO_SQL -#endif - -// CDE style -#if !defined(TQT_NO_STYLE_CDE) && (defined(TQT_NO_STYLE_MOTIF) || defined(TQT_NO_TRANSFORMATIONS)) -#define TQT_NO_STYLE_CDE -#endif - -// Vertical box tqlayout widgets -#if !defined(TQT_NO_VBOX) && (defined(TQT_NO_HBOX)) -#define TQT_NO_VBOX -#endif - -// Button groups -#if !defined(TQT_NO_BUTTONGROUP) && (defined(TQT_NO_GROUPBOX) || defined(TQT_NO_BUTTON)) -#define TQT_NO_BUTTONGROUP -#endif - -// Complex scripts (eg. BiDi) -#if !defined(TQT_NO_COMPLEXTEXT) && (defined(TQT_NO_RICHTEXT)) -#define TQT_NO_COMPLEXTEXT -#endif - -// Cut and paste non-text -#if !defined(TQT_NO_MIMECLIPBOARD) && (defined(TQT_NO_CLIPBOARD)) -#define TQT_NO_MIMECLIPBOARD -#endif - -// Printing -#if !defined(TQT_NO_PRINTER) && (defined(TQT_NO_TEXTSTREAM) || defined(TQT_NO_SPRINTF) || defined(TQT_NO_FONTDATABASE) || defined(TQT_NO_DATESTRING) || defined(TQT_NO_REGEXP_CAPTURE)) -#define TQT_NO_PRINTER -#endif - -// Aqua style -#if !defined(TQT_NO_STYLE_ATQUA) && (defined(TQT_NO_STYLE_WINDOWS) || defined(TQT_NO_IMAGE_TRANSFORMATION)) -#define TQT_NO_STYLE_ATQUA -#endif - -// Vertical group boxes -#if !defined(TQT_NO_VGROUPBOX) && (defined(TQT_NO_HGROUPBOX)) -#define TQT_NO_VGROUPBOX -#endif - -// Horizontal button groups -#if !defined(TQT_NO_HBUTTONGROUP) && (defined(TQT_NO_BUTTONGROUP)) -#define TQT_NO_HBUTTONGROUP -#endif - -// Server to play sound -#if !defined(TQT_NO_TQWS_SOUNDSERVER) && (defined(TQT_NO_SOUND) || defined(TQT_NO_DIR) || defined(TQT_NO_DNS)) -#define TQT_NO_TQWS_SOUNDSERVER -#endif - -// TQHeader -#if !defined(TQT_NO_HEADER) && (defined(TQT_NO_STYLE) || defined(TQT_NO_ICONSET)) -#define TQT_NO_HEADER -#endif - -// Vertical button groups -#if !defined(TQT_NO_VBUTTONGROUP) && (defined(TQT_NO_HBUTTONGROUP)) -#define TQT_NO_VBUTTONGROUP -#endif - -// Hebrew Codec -#if !defined(TQT_NO_CODEC_HEBREW) && (defined(TQT_NO_CODECS) || defined(TQT_NO_COMPLEXTEXT)) -#define TQT_NO_CODEC_HEBREW -#endif - -// HTTP file access -#if !defined(TQT_NO_NETWORKPROTOCOL_HTTP) && (defined(TQT_NO_NETWORKPROTOCOL) || defined(TQT_NO_DNS)) -#define TQT_NO_NETWORKPROTOCOL_HTTP -#endif - -// Tool-buttons -#if !defined(TQT_NO_TOOLBUTTON) && (defined(TQT_NO_BUTTON) || defined(TQT_NO_ICONSET) || defined(TQT_NO_STYLE)) -#define TQT_NO_TOOLBUTTON -#endif - -// Big Codecs (eg. CJK) -#if !defined(TQT_NO_BIG_CODECS) && (defined(TQT_NO_CODEC_HEBREW)) -#define TQT_NO_BIG_CODECS -#endif - -// Experimental internal class -#if !defined(TQT_NO_DIALOGBUTTONS) && (defined(TQT_NO_LAYOUT) || defined(TQT_NO_STYLE) || defined(TQT_NO_PUSHBUTTON)) -#define TQT_NO_DIALOGBUTTONS -#endif - -// Document Object Model -#if !defined(TQT_NO_DOM) && (defined(TQT_NO_XML) || defined(TQT_NO_MIME)) -#define TQT_NO_DOM -#endif - -// Scrollable view widgets -#if !defined(TQT_NO_SCROLLVIEW) && (defined(TQT_NO_SCROLLBAR) || defined(TQT_NO_FRAME)) -#define TQT_NO_SCROLLVIEW -#endif - -// Tab-bars -#if !defined(TQT_NO_TABBAR) && (defined(TQT_NO_TOOLBUTTON)) -#define TQT_NO_TABBAR -#endif - -// Drag and drop -#if !defined(TQT_NO_DRAGANDDROP) && (defined(TQT_NO_MIME) || defined(TQT_NO_TQWS_PROPERTIES) || defined(TQT_NO_IMAGEIO_XPM)) -#define TQT_NO_DRAGANDDROP -#endif - -// TQGridView -#if !defined(TQT_NO_GRIDVIEW) && (defined(TQT_NO_SCROLLVIEW)) -#define TQT_NO_GRIDVIEW -#endif - -// Popup-menus -#if !defined(TQT_NO_POPUPMENU) && (defined(TQT_NO_MENUDATA) || defined(TQT_NO_FRAME)) -#define TQT_NO_POPUPMENU -#endif - -// TQCanvas -#if !defined(TQT_NO_CANVAS) && (defined(TQT_NO_SCROLLVIEW) || defined(TQT_NO_BEZIER)) -#define TQT_NO_CANVAS -#endif - -// Dynamic module linking -#if !defined(TQT_NO_COMPONENT) && (defined(TQT_NO_TQUUID_STRING) || defined(TQT_NO_SETTINGS) || defined(TQT_NO_SPRINTF) || defined(TQT_NO_LIBRARY) || defined(TQT_NO_DATESTRING)) -#define TQT_NO_COMPONENT -#endif - -// TQListBox -#if !defined(TQT_NO_LISTBOX) && (defined(TQT_NO_SCROLLVIEW) || defined(TQT_NO_STRINGLIST)) -#define TQT_NO_LISTBOX -#endif - -// Menu bars -#if !defined(TQT_NO_MENUBAR) && (defined(TQT_NO_POPUPMENU)) -#define TQT_NO_MENUBAR -#endif - -// TQMessageBox -#if !defined(TQT_NO_MESSAGEBOX) && (defined(TQT_NO_DIALOG) || defined(TQT_NO_PUSHBUTTON) || defined(TQT_NO_LABEL)) -#define TQT_NO_MESSAGEBOX -#endif - -// FTP file access -#if !defined(TQT_NO_NETWORKPROTOCOL_FTP) && (defined(TQT_NO_NETWORKPROTOCOL) || defined(TQT_NO_DNS) || defined(TQT_NO_TEXTDATE)) -#define TQT_NO_NETWORKPROTOCOL_FTP -#endif - -// Spin boxes -#if !defined(TQT_NO_SPINBOX) && (defined(TQT_NO_RANGECONTROL) || defined(TQT_NO_SPINWIDGET) || defined(TQT_NO_LINEEDIT) || defined(TQT_NO_VALIDATOR)) -#define TQT_NO_SPINBOX -#endif - -// RichText (HTML) tables and images -#if !defined(TQT_NO_TEXTCUSTOMITEM) && (defined(TQT_NO_RICHTEXT) || defined(TQT_NO_MIME)) -#define TQT_NO_TEXTCUSTOMITEM -#endif - -// TQDateTimeEdit -#if !defined(TQT_NO_DATETIMEEDIT) && (defined(TQT_NO_RICHTEXT) || defined(TQT_NO_SPINWIDGET) || defined(TQT_NO_DATESTRING)) -#define TQT_NO_DATETIMEEDIT -#endif - -// TQTextCodecPlugin -#if !defined(TQT_NO_TEXTCODECPLUGIN) && (defined(TQT_NO_COMPONENT) || defined(TQT_NO_TEXTCODEC)) -#define TQT_NO_TEXTCODECPLUGIN -#endif - -// TQImageFormatPlugin -#if !defined(TQT_NO_IMAGEFORMATPLUGIN) && (defined(TQT_NO_COMPONENT) || defined(TQT_NO_IMAGEIO)) -#define TQT_NO_IMAGEFORMATPLUGIN -#endif - -// TQSqlForm -#if !defined(TQT_NO_STQL_FORM) && (defined(TQT_NO_SQL) || defined(TQT_NO_PROPERTIES)) -#define TQT_NO_STQL_FORM -#endif - -// Scalable Vector Graphics (SVG) -#if !defined(TQT_NO_SVG) && (defined(TQT_NO_DOM) || defined(TQT_NO_TRANSFORMATIONS) || defined(TQT_NO_SPRINTF)) -#define TQT_NO_SVG -#endif - -// TQIconView -#if !defined(TQT_NO_ICONVIEW) && (defined(TQT_NO_SCROLLVIEW) || defined(TQT_NO_IMAGEIO_XPM) || defined(TQT_NO_IMAGE_HEURISTIC_MASK)) -#define TQT_NO_ICONVIEW -#endif - -// Tab widgets -#if !defined(TQT_NO_TABWIDGET) && (defined(TQT_NO_TABBAR) || defined(TQT_NO_WIDGETSTACK)) -#define TQT_NO_TABWIDGET -#endif - -// "What's this" help -#if !defined(TQT_NO_WHATSTHIS) && (defined(TQT_NO_TOOLTIP) || defined(TQT_NO_TOOLBUTTON)) -#define TQT_NO_WHATSTHIS -#endif - -// TQWidgetPlugin -#if !defined(TQT_NO_WIDGETPLUGIN) && (defined(TQT_NO_COMPONENT) || defined(TQT_NO_ICONSET)) -#define TQT_NO_WIDGETPLUGIN -#endif - -// TQProgressDialog -#if !defined(TQT_NO_PROGRESSDIALOG) && (defined(TQT_NO_SEMIMODAL) || defined(TQT_NO_LABEL) || defined(TQT_NO_PUSHBUTTON) || defined(TQT_NO_PROGRESSBAR)) -#define TQT_NO_PROGRESSDIALOG -#endif - -// Motif-plus style -#if !defined(TQT_NO_STYLE_MOTIFPLUS) && (defined(TQT_NO_STYLE_MOTIF) || defined(TQT_NO_TRANSFORMATIONS) || defined(TQT_NO_BUTTON) || defined(TQT_NO_SCROLLBAR) || defined(TQT_NO_SLIDER)) -#define TQT_NO_STYLE_MOTIFPLUS -#endif - -// Rich text edit -#if !defined(TQT_NO_TEXTEDIT) && (defined(TQT_NO_RICHTEXT) || defined(TQT_NO_SCROLLVIEW)) -#define TQT_NO_TEXTEDIT -#endif - -// TQWizard -#if !defined(TQT_NO_WIZARD) && (defined(TQT_NO_DIALOG) || defined(TQT_NO_WIDGETSTACK) || defined(TQT_NO_PUSHBUTTON) || defined(TQT_NO_LAYOUT) || defined(TQT_NO_LABEL)) -#define TQT_NO_WIZARD -#endif - -// Multi-line edits -#if !defined(TQT_NO_MULTILINEEDIT) && (defined(TQT_NO_TEXTEDIT)) -#define TQT_NO_MULTILINEEDIT -#endif - -// Rich text syntax highlighting -#if !defined(TQT_NO_SYNTAXHIGHLIGHTER) && (defined(TQT_NO_TEXTEDIT)) -#define TQT_NO_SYNTAXHIGHLIGHTER -#endif - -// TQTextView -#if !defined(TQT_NO_TEXTVIEW) && (defined(TQT_NO_TEXTEDIT)) -#define TQT_NO_TEXTVIEW -#endif - -// TQTabDialog -#if !defined(TQT_NO_TABDIALOG) && (defined(TQT_NO_DIALOG) || defined(TQT_NO_PUSHBUTTON) || defined(TQT_NO_LAYOUT) || defined(TQT_NO_TABWIDGET)) -#define TQT_NO_TABDIALOG -#endif - -// TQTextBrowser -#if !defined(TQT_NO_TEXTBROWSER) && (defined(TQT_NO_TEXTVIEW) || defined(TQT_NO_MIME)) -#define TQT_NO_TEXTBROWSER -#endif - -// TQListView -#if !defined(TQT_NO_LISTVIEW) && (defined(TQT_NO_SCROLLVIEW) || defined(TQT_NO_HEADER) || defined(TQT_NO_LINEEDIT)) -#define TQT_NO_LISTVIEW -#endif - -// TQComboBox -#if !defined(TQT_NO_COMBOBOX) && (defined(TQT_NO_LISTBOX) || defined(TQT_NO_LINEEDIT) || defined(TQT_NO_POPUPMENU)) -#define TQT_NO_COMBOBOX -#endif - -// TQColorDialog -#if !defined(TQT_NO_COLORDIALOG) && (defined(TQT_NO_DIALOG) || defined(TQT_NO_LABEL) || defined(TQT_NO_PUSHBUTTON) || defined(TQT_NO_LINEEDIT) || defined(TQT_NO_VALIDATOR) || defined(TQT_NO_GRIDVIEW) || defined(TQT_NO_LAYOUT)) -#define TQT_NO_COLORDIALOG -#endif - -// Tool box -#if !defined(TQT_NO_TOOLBOX) && (defined(TQT_NO_ICONSET) || defined(TQT_NO_SCROLLVIEW) || defined(TQT_NO_TOOLTIP) || defined(TQT_NO_LAYOUT) || defined(TQT_NO_TOOLBUTTON)) -#define TQT_NO_TOOLBOX -#endif - -// SGI style -#if !defined(TQT_NO_STYLE_SGI) && (defined(TQT_NO_STYLE_MOTIF) || defined(TQT_NO_TRANSFORMATIONS) || defined(TQT_NO_BUTTON) || defined(TQT_NO_SCROLLBAR) || defined(TQT_NO_SLIDER) || defined(TQT_NO_LINEEDIT) || defined(TQT_NO_MENUBAR)) -#define TQT_NO_STYLE_SGI -#endif - -// TQErrorMessage -#if !defined(TQT_NO_ERRORMESSAGE) && (defined(TQT_NO_DIALOG) || defined(TQT_NO_PUSHBUTTON) || defined(TQT_NO_LABEL) || defined(TQT_NO_CHECKBOX) || defined(TQT_NO_TEXTVIEW)) -#define TQT_NO_ERRORMESSAGE -#endif - -// Main-windows -#if !defined(TQT_NO_MAINWINDOW) && (defined(TQT_NO_STRINGLIST) || defined(TQT_NO_POPUPMENU) || defined(TQT_NO_TITLEBAR) || defined(TQT_NO_RESIZEHANDLER) || defined(TQT_NO_TOOLBUTTON) || defined(TQT_NO_STATUSBAR)) -#define TQT_NO_MAINWINDOW -#endif - -// Toolbars -#if !defined(TQT_NO_TOOLBAR) && (defined(TQT_NO_MAINWINDOW)) -#define TQT_NO_TOOLBAR -#endif - -// TQAction -#if !defined(TQT_NO_ACTION) && (defined(TQT_NO_TOOLBUTTON) || defined(TQT_NO_COMBOBOX)) -#define TQT_NO_ACTION -#endif - -// TQTable -#if !defined(TQT_NO_TABLE) && (defined(TQT_NO_COMBOBOX) || defined(TQT_NO_HEADER) || defined(TQT_NO_CHECKBOX)) -#define TQT_NO_TABLE -#endif - -// TQFontDialog -#if !defined(TQT_NO_FONTDIALOG) && (defined(TQT_NO_DIALOG) || defined(TQT_NO_FONTDATABASE) || defined(TQT_NO_COMBOBOX) || defined(TQT_NO_LABEL) || defined(TQT_NO_CHECKBOX) || defined(TQT_NO_PUSHBUTTON) || defined(TQT_NO_VGROUPBOX) || defined(TQT_NO_VALIDATOR)) -#define TQT_NO_FONTDIALOG -#endif - -// TQInputDialog -#if !defined(TQT_NO_INPUTDIALOG) && (defined(TQT_NO_DIALOG) || defined(TQT_NO_COMBOBOX) || defined(TQT_NO_LABEL) || defined(TQT_NO_PUSHBUTTON) || defined(TQT_NO_SPINBOX) || defined(TQT_NO_WIDGETSTACK) || defined(TQT_NO_LAYOUT)) -#define TQT_NO_INPUTDIALOG -#endif - -// SQL value editor widgets -#if !defined(TQT_NO_STQL_EDIT_WIDGETS) && (defined(TQT_NO_SQL) || defined(TQT_NO_SPINBOX) || defined(TQT_NO_COMBOBOX) || defined(TQT_NO_CHECKBOX) || defined(TQT_NO_DATETIMEEDIT)) -#define TQT_NO_STQL_EDIT_WIDGETS -#endif - -// TQPrintDialog -#if !defined(TQT_NO_PRINTDIALOG) && (defined(TQT_NO_DIALOG) || defined(TQT_NO_LISTVIEW) || defined(TQT_NO_PRINTER) || defined(TQT_NO_COMBOBOX) || defined(TQT_NO_LABEL) || defined(TQT_NO_BUTTONGROUP) || defined(TQT_NO_SPINBOX) || defined(TQT_NO_RADIOBUTTON) || defined(TQT_NO_PUSHBUTTON) || defined(TQT_NO_DIR)) -#define TQT_NO_PRINTDIALOG -#endif - -// TQFileDialog -#if !defined(TQT_NO_FILEDIALOG) && (defined(TQT_NO_MESSAGEBOX) || defined(TQT_NO_LISTVIEW) || defined(TQT_NO_NETWORKPROTOCOL) || defined(TQT_NO_COMBOBOX) || defined(TQT_NO_SEMIMODAL) || defined(TQT_NO_REGEXP_CAPTURE) || defined(TQT_NO_TOOLBUTTON) || defined(TQT_NO_BUTTONGROUP) || defined(TQT_NO_VBOX) || defined(TQT_NO_SPLITTER) || defined(TQT_NO_PROGRESSBAR) || defined(TQT_NO_WIDGETSTACK) || defined(TQT_NO_DATESTRING)) -#define TQT_NO_FILEDIALOG -#endif - -// SQL table widgets -#if !defined(TQT_NO_STQL_VIEW_WIDGETS) && (defined(TQT_NO_STQL_FORM) || defined(TQT_NO_STQL_EDIT_WIDGETS) || defined(TQT_NO_TABLE)) -#define TQT_NO_STQL_VIEW_WIDGETS -#endif - -// TQWorkSpace -#if !defined(TQT_NO_WORKSPACE) && (defined(TQT_NO_SCROLLBAR) || defined(TQT_NO_VBOX) || defined(TQT_NO_TITLEBAR) || defined(TQT_NO_RESIZEHANDLER) || defined(TQT_NO_POPUPMENU) || defined(TQT_NO_LABEL) || defined(TQT_NO_TOOLBUTTON) || defined(TQT_NO_MAINWINDOW) || defined(TQT_NO_TOOLBAR) || defined(TQT_NO_MENUBAR)) -#define TQT_NO_WORKSPACE -#endif - -// Input method -#if !defined(TQT_NO_IM) && (defined(TQT_NO_STRINGLIST)) -#define TQT_NO_IM -#endif - -// Input method extensions -#if !defined(TQT_NO_IM_EXTENSIONS) && (defined(TQT_NO_IM) || defined(TQT_NO_STRINGLIST)) -#define TQT_NO_IM_EXTENSIONS -#endif - diff --git a/tqtinterface/qt4/src/tools/tqfile.cpp b/tqtinterface/qt4/src/tools/tqfile.cpp deleted file mode 100644 index c53c9f7..0000000 --- a/tqtinterface/qt4/src/tools/tqfile.cpp +++ /dev/null @@ -1,783 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQFile class -** -** Created : 930812 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" - -// POSIX Large File Support redefines open -> open64 -#if defined(open) -# undef open -#endif - -// POSIX Large File Support redefines truncate -> truncate64 -#if defined(truncate) -# undef truncate -#endif - -#include "tqfile.h" -#ifndef NO_ERRNO_H -#include <errno.h> -#endif - - -// Duplicated from tqobject.h, but we cannot include tqobject.h here since -// it causes qmake to not build on irix g++ -#define TQT_TRANSLATE_NOOP(scope,x) (x) - -const char* qt_fileerr_unknown = TQT_TRANSLATE_NOOP( "TQFile", "Unknown error" ); -const char* qt_fileerr_read = TQT_TRANSLATE_NOOP( "TQFile", "Could not read from the file" ); -const char* qt_fileerr_write = TQT_TRANSLATE_NOOP( "TQFile", "Could not write to the file" ); - -#define TQFILEERR_EACCES TQT_TRANSLATE_NOOP( "TQFile", "Permission denied" ) -#define TQFILEERR_EMFILE TQT_TRANSLATE_NOOP( "TQFile", "Too many open files" ) -#define TQFILEERR_ENOENT TQT_TRANSLATE_NOOP( "TQFile", "No such file or directory" ) -#define TQFILEERR_ENOSPC TQT_TRANSLATE_NOOP( "TQFile", "No space left on tqdevice" ) - -#ifdef USE_QT4 - -/*! - \overload - - Reads a line of text. - - Reads bytes from the file into string \a s, until end-of-line or - \a maxlen bytes have been read, whichever occurs first. Returns - the number of bytes read, or -1 if there was an error, e.g. end of - file. Any terminating newline is not stripped. - - This function is only efficient for buffered files. Avoid using - readLine() for files that have been opened with the \c IO_Raw - flag. - - Note that the string is read as plain Latin1 bytes, not Unicode. - - \sa readBlock(), TQTextStream::readLine() -*/ - -TQ_LONG TQFile::readLine( TQString& s, TQ_ULONG maxlen ) -{ - TQByteArray ba(maxlen); - TQ_LONG l = readLine(ba.data(),maxlen); - if ( l >= 0 ) { - ba.truncate(l); - s = TQString(ba); - } - return l; -} - -#else // USE_QT4 - -class TQFilePrivate -{ -public: - TQString errorString; -}; - -extern bool qt_file_access( const TQString& fn, int t ); - -/*! - \class TQFile tqfile.h - \reentrant - \brief The TQFile class is an I/O tqdevice that operates on files. - - \ingroup io - \mainclass - - TQFile is an I/O tqdevice for reading and writing binary and text - files. A TQFile may be used by itself or more conveniently with a - TQDataStream or TQTextStream. - - The file name is usually passed in the constructor but can be - changed with setName(). You can check for a file's existence with - exists() and remove a file with remove(). - - The file is opened with open(), closed with close() and flushed - with flush(). Data is usually read and written using TQDataStream - or TQTextStream, but you can read with readBlock() and readLine() - and write with writeBlock(). TQFile also supports getch(), - ungetch() and putch(). - - The size of the file is returned by size(). You can get the - current file position or move to a new file position using the - at() functions. If you've reached the end of the file, atEnd() - returns TRUE. The file handle is returned by handle(). - - Here is a code fragment that uses TQTextStream to read a text file - line by line. It prints each line with a line number. - \code - TQStringList lines; - TQFile file( "file.txt" ); - if ( file.open( IO_ReadOnly ) ) { - TQTextStream stream( &file ); - TQString line; - int i = 1; - while ( !stream.atEnd() ) { - line = stream.readLine(); // line of text excluding '\n' - printf( "%3d: %s\n", i++, line.latin1() ); - lines += line; - } - file.close(); - } - \endcode - - Writing text is just as easy. The following example shows how to - write the data we read into the string list from the previous - example: - \code - TQFile file( "file.txt" ); - if ( file.open( IO_WriteOnly ) ) { - TQTextStream stream( &file ); - for ( TQStringList::Iterator it = lines.begin(); it != lines.end(); ++it ) - stream << *it << "\n"; - file.close(); - } - \endcode - - The TQFileInfo class holds detailed information about a file, such - as access permissions, file dates and file types. - - The TQDir class manages directories and lists of file names. - - TQt uses Unicode file names. If you want to do your own I/O on Unix - systems you may want to use encodeName() (and decodeName()) to - convert the file name into the local encoding. - - \important readAll() at() - - \sa TQDataStream, TQTextStream -*/ - -/*! - \fn TQ_LONG TQFile::writeBlock( const TQByteArray& data ) - - \overload -*/ - - -/*! - Constructs a TQFile with no name. -*/ - -TQFile::TQFile() -: d(0) -{ - init(); -} - -/*! - Constructs a TQFile with a file name \a name. - - \sa setName() -*/ - -TQFile::TQFile( const TQString &name ) - : fn(name), d(0) -{ - init(); -} - - -/*! - Destroys a TQFile. Calls close(). -*/ - -TQFile::~TQFile() -{ - close(); - delete d; -} - - -/*! - \internal - Initialize internal data. -*/ - -void TQFile::init() -{ - delete d; - d = new TQFilePrivate; - setFlags( IO_Direct ); - setqStatus( IO_Ok ); - setErrorString( qt_fileerr_unknown ); - fh = 0; - fd = 0; - length = 0; - ioIndex = 0; - ext_f = FALSE; // not an external file handle -} - - -/*! - \fn TQString TQFile::name() const - - Returns the name set by setName(). - - \sa setName(), TQFileInfo::fileName() -*/ - -/*! - Sets the name of the file to \a name. The name can have no path, a - relative path or an absolute absolute path. - - Do not call this function if the file has already been opened. - - If the file name has no path or a relative path, the path used - will be whatever the application's current directory path is - \e{at the time of the open()} call. - - Example: - \code - TQFile file; - TQDir::setCurrent( "/tmp" ); - file.setName( "readme.txt" ); - TQDir::setCurrent( "/home" ); - file.open( IO_ReadOnly ); // opens "/home/readme.txt" under Unix - \endcode - - Note that the directory separator "/" works for all operating - systems supported by TQt. - - \sa name(), TQFileInfo, TQDir -*/ - -void TQFile::setName( const TQString &name ) -{ - if ( isOpen() ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQFile::setName: File is open" ); -#endif - close(); - } - fn = name; -} - -/*! - \overload - - Returns TRUE if this file exists; otherwise returns FALSE. - - \sa name() -*/ - -bool TQFile::exists() const -{ - return qt_file_access( fn, F_OK ); -} - -/*! - Returns TRUE if the file given by \a fileName exists; otherwise - returns FALSE. -*/ - -bool TQFile::exists( const TQString &fileName ) -{ - return qt_file_access( fileName, F_OK ); -} - - -/*! - Removes the file specified by the file name currently set. Returns - TRUE if successful; otherwise returns FALSE. - - The file is closed before it is removed. -*/ - -bool TQFile::remove() -{ - close(); - return remove( fn ); -} - -#if defined(TQ_OS_MAC) || defined(TQ_OS_MSDOS) || defined(TQ_OS_WIN32) || defined(TQ_OS_OS2) -# define HAS_TEXT_FILEMODE // has translate/text filemode -#endif -#if defined(O_NONBLOCK) -# define HAS_ASYNC_FILEMODE -# define OPEN_ASYNC O_NONBLOCK -#elif defined(O_NDELAY) -# define HAS_ASYNC_FILEMODE -# define OPEN_ASYNC O_NDELAY -#endif - -/*! - Flushes the file buffer to the disk. - - close() also flushes the file buffer. -*/ - -void TQFile::flush() -{ - if ( isOpen() && fh ) { // can only flush open/buffered file - if ( fflush( fh ) ) { // write error - if ( errno == ENOSPC ) // disk is full - setqStatus( IO_ResourceError ); - else - setqStatus( IO_WriteError ); - setErrorStringErrno( errno ); - } - } -} - -/*! \reimp - \fn TQIODevice::Offset TQFile::at() const -*/ - -/*! - Returns TRUE if the end of file has been reached; otherwise returns FALSE. - If TQFile has not been open()'d, then the behavior is undefined. - - \sa size() -*/ - -bool TQFile::atEnd() const -{ - if ( !isOpen() ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQFile::atEnd: File is not open" ); -#endif - return FALSE; - } - if ( isDirectAccess() && !isTranslated() ) { - if ( at() < size() ) - return FALSE; - } - const TQString errorString = d->errorString; - const bool ret = TQIODevice::atEnd(); - if (errorString != d->errorString) - d->errorString = errorString; - return ret; -} - -/*! - Reads a line of text. - - Reads bytes from the file into the char* \a p, until end-of-line - or \a maxlen bytes have been read, whichever occurs first. Returns - the number of bytes read, or -1 if there was an error. Any - terminating newline is not stripped. - - This function is only efficient for buffered files. Avoid - readLine() for files that have been opened with the \c IO_Raw - flag. - - \sa readBlock(), TQTextStream::readLine() -*/ - -TQ_LONG TQFile::readLine( char *p, TQ_ULONG maxlen ) -{ - if ( maxlen == 0 ) // application bug? - return 0; -#if defined(TQT_CHECK_STATE) - TQ_CHECK_PTR( p ); - if ( !isOpen() ) { // file not open - qWarning( "TQFile::readLine: File not open" ); - return -1; - } - if ( !isReadable() ) { // reading not permitted - qWarning( "TQFile::readLine: Read operation not permitted" ); - return -1; - } -#endif - TQ_LONG nread; // number of bytes read - if ( isRaw() ) { // raw file - nread = TQIODevice::readLine( p, maxlen ); - } else { // buffered file - p = fgets( p, maxlen, fh ); - if ( p ) { - nread = tqstrlen( p ); - if ( !isSequentialAccess() ) - ioIndex += nread; - } else { - nread = -1; - setqStatus(IO_ReadError); - setErrorString( qt_fileerr_read ); - } - } - return nread; -} - - -/*! - \overload - - Reads a line of text. - - Reads bytes from the file into string \a s, until end-of-line or - \a maxlen bytes have been read, whichever occurs first. Returns - the number of bytes read, or -1 if there was an error, e.g. end of - file. Any terminating newline is not stripped. - - This function is only efficient for buffered files. Avoid using - readLine() for files that have been opened with the \c IO_Raw - flag. - - Note that the string is read as plain Latin1 bytes, not Unicode. - - \sa readBlock(), TQTextStream::readLine() -*/ - -TQ_LONG TQFile::readLine( TQString& s, TQ_ULONG maxlen ) -{ - TQByteArray ba(maxlen); - TQ_LONG l = readLine(ba.data(),maxlen); - if ( l >= 0 ) { - ba.truncate(l); - s = TQString(ba); - } - return l; -} - - -/*! - Reads a single byte/character from the file. - - Returns the byte/character read, or -1 if the end of the file has - been reached. - - \sa putch(), ungetch() -*/ - -int TQFile::getch() -{ -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { // file not open - qWarning( "TQFile::getch: File not open" ); - return EOF; - } - if ( !isReadable() ) { // reading not permitted - qWarning( "TQFile::getch: Read operation not permitted" ); - return EOF; - } -#endif - - int ch; - - if ( !ungetchBuffer.isEmpty() ) { - int len = ungetchBuffer.length(); - ch = ungetchBuffer[ len-1 ]; - ungetchBuffer.truncate( len - 1 ); - return ch; - } - - if ( isRaw() ) { // raw file (inefficient) - char buf[1]; - ch = readBlock( buf, 1 ) == 1 ? buf[0] : EOF; - } else { // buffered file - if ( (ch = getc( fh )) != EOF ) { - if ( !isSequentialAccess() ) - ioIndex++; - } else { - setqStatus(IO_ReadError); - setErrorString( qt_fileerr_read ); - } - } - return ch; -} - -/*! - Writes the character \a ch to the file. - - Returns \a ch, or -1 if some error occurred. - - \sa getch(), ungetch() -*/ - -int TQFile::putch( int ch ) -{ -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { // file not open - qWarning( "TQFile::putch: File not open" ); - return EOF; - } - if ( !isWritable() ) { // writing not permitted - qWarning( "TQFile::putch: Write operation not permitted" ); - return EOF; - } -#endif - if ( isRaw() ) { // raw file (inefficient) - char buf[1]; - buf[0] = ch; - ch = writeBlock( buf, 1 ) == 1 ? ch : EOF; - } else { // buffered file - if ( (ch = putc( ch, fh )) != EOF ) { - if ( !isSequentialAccess() ) - ioIndex++; - if ( ioIndex > length ) // update file length - length = ioIndex; - } else { - setqStatus(IO_WriteError); - setErrorString( qt_fileerr_write ); - } - } - return ch; -} - -/*! - Puts the character \a ch back into the file and decrements the - index if it is not zero. - - This function is normally called to "undo" a getch() operation. - - Returns \a ch, or -1 if an error occurred. - - \sa getch(), putch() -*/ - -int TQFile::ungetch( int ch ) -{ -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { // file not open - qWarning( "TQFile::ungetch: File not open" ); - return EOF; - } - if ( !isReadable() ) { // reading not permitted - qWarning( "TQFile::ungetch: Read operation not permitted" ); - return EOF; - } -#endif - if ( ch == EOF ) // cannot unget EOF - return ch; - - if ( isSequentialAccess() && !fh) { - // pipe or similar => we cannot ungetch, so do it manually - ungetchBuffer += TQChar(ch); - return ch; - } - - if ( isRaw() ) { // raw file (very inefficient) - char buf[1]; - at( ioIndex-1 ); - buf[0] = ch; - if ( writeBlock(buf, 1) == 1 ) - at ( ioIndex-1 ); - else - ch = EOF; - } else { // buffered file - if ( (ch = ungetc(ch, fh)) != EOF ) { - if ( !isSequentialAccess() ) - ioIndex--; - } else { - setqStatus( IO_ReadError ); - setErrorString( qt_fileerr_read ); - } - } - return ch; -} - - -static TQCString locale_encoder( const TQString &fileName ) -{ - return fileName.local8Bit(); -} - - -static TQFile::EncoderFn encoder = locale_encoder; - -/*! - When you use TQFile, TQFileInfo, and TQDir to access the file system - with TQt, you can use Unicode file names. On Unix, these file names - are converted to an 8-bit encoding. If you want to do your own - file I/O on Unix, you should convert the file name using this - function. On Windows NT/2000, Unicode file names are supported - directly in the file system and this function should be avoided. - On Windows 95, non-Latin1 locales are not supported. - - By default, this function converts \a fileName to the local 8-bit - encoding determined by the user's locale. This is sufficient for - file names that the user chooses. File names hard-coded into the - application should only use 7-bit ASCII filename characters. - - The conversion scheme can be changed using setEncodingFunction(). - This might be useful if you wish to give the user an option to - store file names in UTF-8, etc., but be aware that such file names - would probably then be unrecognizable when seen by other programs. - - \sa decodeName() -*/ - -TQCString TQFile::encodeName( const TQString &fileName ) -{ - return (*encoder)(fileName); -} - -/*! - \enum TQFile::EncoderFn - - This is used by TQFile::setEncodingFunction(). -*/ - -/*! - \nonreentrant - - Sets the function for encoding Unicode file names to \a f. The - default encodes in the locale-specific 8-bit encoding. - - \sa encodeName() -*/ -void TQFile::setEncodingFunction( EncoderFn f ) -{ - encoder = f; -} - -static -TQString locale_decoder( const TQCString &localFileName ) -{ -#ifndef TQ_WS_MAC - return TQString::fromLocal8Bit(localFileName); -#else - extern TQString qt_mac_precomposeFileName(const TQString &); // qglobal.cpp - return qt_mac_precomposeFileName(TQString::fromLocal8Bit(localFileName)); -#endif -} - -static TQFile::DecoderFn decoder = locale_decoder; - -/*! - This does the reverse of TQFile::encodeName() using \a localFileName. - - \sa setDecodingFunction() -*/ -TQString TQFile::decodeName( const TQCString &localFileName ) -{ - return (*decoder)(localFileName); -} - -/*! - \enum TQFile::DecoderFn - - This is used by TQFile::setDecodingFunction(). -*/ - -/*! - \nonreentrant - - Sets the function for decoding 8-bit file names to \a f. The - default uses the locale-specific 8-bit encoding. - - \sa encodeName(), decodeName() -*/ - -void TQFile::setDecodingFunction( DecoderFn f ) -{ - decoder = f; -} - -/*! - Returns a human-readable description of the reason of an error that occurred - on the tqdevice. The error described by the string corresponds to changes of - TQIODevice::status(). If the status is reset, the error string is also reset. - - The returned strings are not translated with the TQObject::tr() or - TQApplication::translate() functions. They are marked as translatable - strings in the "TQFile" context. Before you show the string to the user you - should translate it first, for example: - - \code - TQFile f( "address.dat" ); - if ( !f.open( IO_ReadOnly ) { - TQMessageBox::critical( - this, - tr("Open failed"), - tr("Could not open file for reading: %1").arg( tqApp->translate("TQFile",f.errorString()) ) - ); - return; - } - \endcode - - \sa TQIODevice::status(), TQIODevice::resetqStatus(), setErrorString() -*/ - -TQString TQFile::errorString() const -{ - if ( status() == IO_Ok ) - return qt_fileerr_unknown; - return d->errorString; -} - -/*! - \nonreentrant - - Sets the error string returned by the errorString() function to \a str. - - \sa errorString(), TQIODevice::status() -*/ - -void TQFile::setErrorString( const TQString& str ) -{ - d->errorString = str; -} - -void TQFile::setErrorStringErrno( int errnum ) -{ - switch ( errnum ) { - case EACCES: - d->errorString = TQFILEERR_EACCES; - break; - case EMFILE: - d->errorString = TQFILEERR_EMFILE; - break; - case ENOENT: - d->errorString = TQFILEERR_ENOENT; - break; - case ENOSPC: - d->errorString = TQFILEERR_ENOSPC; - break; - default: -#ifndef TQ_OS_TEMP - d->errorString = TQString::fromLocal8Bit( strerror( errnum ) ); -#else - { - unsigned short *string; - FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - errnum, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&string, - 0, - NULL ); - d->errorString = TQString::fromUcs2( string ); - LocalFree( (HLOCAL)string ); - } -#endif - break; - } -} - -#endif // USE_QT4
\ No newline at end of file diff --git a/tqtinterface/qt4/src/tools/tqfile.h b/tqtinterface/qt4/src/tools/tqfile.h deleted file mode 100644 index 10b69e6..0000000 --- a/tqtinterface/qt4/src/tools/tqfile.h +++ /dev/null @@ -1,209 +0,0 @@ -/**************************************************************************** -** -** Definition of TQFile class -** -** Created : 930831 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQFILE_H -#define TQFILE_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqiodevice.h" -#include "tqstring.h" -#include <stdio.h> -#endif // TQT_H - -#ifdef USE_QT4 - -#include <Qt/qfile.h> - -#endif // USE_QT4 - -class TQDir; -class TQFilePrivate; - -#ifdef USE_QT4 - -class TQ_EXPORT TQFile : public QFile -{ -public: - TQFile() : QFile() {} - TQFile( const QString &name ) : QFile( name ) {} - - bool open( int aFlags, FILE * f ) { return QFile::open( f, (QIODevice::OpenModeFlag)aFlags ); } - bool open( int aFlags, int f ) { return QFile::open( f, (QIODevice::OpenModeFlag)aFlags ); } - TQString name() const { return fileName(); } - void setName( const QString &name ) { setFileName(name); } - bool open( int om ) { return QFile::open((OpenMode)om); } - int state() const { return isOpen() ? 0x1000 : 0; } - - inline TQ_LONG readLine( char *data, TQ_ULONG maxlen ) { return QFile::readLine(data, maxlen); } - TQ_LONG readLine( TQString &, TQ_ULONG maxlen ); - - TQIODevice::Status status() const { -#if !defined(QT_NO_QOBJECT) - const QFile *f = qobject_cast<const QFile *>(this); - if (f) return (int) f->error(); -#endif - return isOpen() ? 0 /* IO_Ok */ : 8 /* IO_UnspecifiedError */; - } - - inline TQIODevice::Offset at() const { return TQT_TQIODEVICE_CONST(this)->at(); } - inline bool at(TQIODevice::Offset offset) { return TQT_TQIODEVICE(this)->at(offset); } - inline TQIODevice::Offset tqat() const { return TQT_TQIODEVICE_CONST(this)->at(); } - inline bool tqat(TQIODevice::Offset offset) { return TQT_TQIODEVICE(this)->at(offset); } - - inline qint64 readBlock(char *data, quint64 maxlen) { return read(data, maxlen); } - inline qint64 writeBlock(const char *data, quint64 len) { return write(data, len); } - inline qint64 writeBlock(const QByteArray &data) { return write(data); } - - inline int getch() { char c; return getChar(&c) ? int(uchar(c)) : -1; } - inline int putch(int c) { return putChar(char(c)) ? int(uchar(c)) : -1; } - inline int ungetch(int c) { ungetChar(uchar(c)); return c; } - - inline bool isDirectAccess() const { return !isSequential(); } - inline bool isSequentialAccess() const { return isSequential(); } - inline bool isCombinedAccess() const { return false; } - inline bool isBuffered() const { return true; } - inline bool isRaw() const { return false; } - inline bool isSynchronous() const { return true; } - inline bool isAsynchronous() const { return false; } - inline bool isTranslated() const { return (openMode() & Text) != 0; } - inline bool isInactive() const { return !isOpen(); } - -// inline bool open( int mode ) = 0; - -protected: - void setqStatus( int ) { std::cout << "[WARNING] TQIODevice::setqStatus() UNIMPLEMENTED\n\r"; } - void resetqStatus() { TQT_TQIODEVICE(this)->resetStatus(); } - - void setFlags( int f ) { setOpenMode((QIODevice::OpenModeFlag)f); } - void setType( int ) { printf("[WARNING] TQIODevice::setType() unimplemented\n\r"); } - void setMode( int f ) { setOpenMode((QIODevice::OpenModeFlag)f); } - void setState( int state ) { - switch (state) { - case (IO_Open): - open(openMode()); - break; - } - } -}; - -#else // USE_QT4 - -class TQ_EXPORT TQFile : public TQIODevice // file I/O tqdevice class -{ -public: - TQFile(); - TQFile( const TQString &name ); - ~TQFile(); - - TQString name() const; - void setName( const TQString &name ); - - typedef TQCString (*EncoderFn)( const TQString &fileName ); - typedef TQString (*DecoderFn)( const TQCString &localfileName ); - static TQCString encodeName( const TQString &fileName ); - static TQString decodeName( const TQCString &localFileName ); - static void setEncodingFunction( EncoderFn ); - static void setDecodingFunction( DecoderFn ); - - bool exists() const; - static bool exists( const TQString &fileName ); - - bool remove(); - static bool remove( const TQString &fileName ); - - bool open( int ); - bool open( int, FILE * ); - bool open( int, int ); - void close(); - void flush(); - - Offset size() const; - Offset at() const; - bool at( Offset ); - bool atEnd() const; - - TQ_LONG readBlock( char *data, TQ_ULONG len ); - TQ_LONG writeBlock( const char *data, TQ_ULONG len ); - TQ_LONG writeBlock( const TQByteArray& data ) - { return TQIODevice::writeBlock(data); } - TQ_LONG readLine( char *data, TQ_ULONG maxlen ); - TQ_LONG readLine( TQString &, TQ_ULONG maxlen ); - - int getch(); - int putch( int ); - int ungetch( int ); - - int handle() const; - - TQString errorString() const; // ### TQt 4: move into TQIODevice - -protected: - void setErrorString( const TQString& ); // ### TQt 4: move into TQIODevice - TQString fn; - FILE *fh; - int fd; - Offset length; - bool ext_f; - TQFilePrivate *d; // ### TQt 4: make private - -private: - void init(); - void setErrorStringErrno( int ); - TQCString ungetchBuffer; - -private: // Disabled copy constructor and operator= -#if defined(TQ_DISABLE_COPY) - TQFile( const TQFile & ); - TQFile &operator=( const TQFile & ); -#endif -}; - - -inline TQString TQFile::name() const -{ return fn; } - -inline TQIODevice::Offset TQFile::at() const -{ return ioIndex; } - -#endif // USE_QT4 - -#endif // TQFILE_H diff --git a/tqtinterface/qt4/src/tools/tqfile_unix.cpp b/tqtinterface/qt4/src/tools/tqfile_unix.cpp deleted file mode 100644 index 5e680d4..0000000 --- a/tqtinterface/qt4/src/tools/tqfile_unix.cpp +++ /dev/null @@ -1,753 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQFile class -** -** Created : 950628 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" -#include "tqtglobaldefines.h" - -// POSIX Large File Support redefines open -> open64 -static inline int qt_open(const char *pathname, int flags, mode_t mode) -{ return ::open(pathname, flags, mode); } -#if defined(open) -# undef open -#endif - -// POSIX Large File Support redefines truncate -> truncate64 -#if defined(truncate) -# undef truncate -#endif - -#include "tqfile.h" -#include <errno.h> -#include <limits.h> - -extern const char* qt_fileerr_read; - -bool qt_file_access( const TQString& fn, int t ) -{ - if ( fn.isEmpty() ) - return FALSE; - return ::access( TQFile::encodeName(fn), t ) == 0; -} - -#ifdef USE_QT4 - -#else // USE_QT4 - -/*! - \overload - Removes the file \a fileName. - Returns TRUE if successful, otherwise FALSE. -*/ - -bool TQFile::remove( const TQString &fileName ) -{ - if ( fileName.isEmpty() ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQFile::remove: Empty or null file name" ); -#endif - return FALSE; - } - return unlink( TQFile::encodeName(fileName) ) == 0; -} - -#if defined(O_NONBLOCK) -# define HAS_ASYNC_FILEMODE -# define OPEN_ASYNC O_NONBLOCK -#elif defined(O_NDELAY) -# define HAS_ASYNC_FILEMODE -# define OPEN_ASYNC O_NDELAY -#endif - -/*! - Opens the file specified by the file name currently set, using the - mode \a m. Returns TRUE if successful, otherwise FALSE. - - \keyword IO_Raw - \keyword IO_ReadOnly - \keyword IO_WriteOnly - \keyword IO_ReadWrite - \keyword IO_Append - \keyword IO_Truncate - \keyword IO_Translate - - The mode parameter \a m must be a combination of the following flags: - \table - \header \i Flag \i Meaning - \row \i IO_Raw - \i Raw (non-buffered) file access. - \row \i IO_ReadOnly - \i Opens the file in read-only mode. - \row \i IO_WriteOnly - \i Opens the file in write-only mode. If this flag is used - with another flag, e.g. \c IO_ReadOnly or \c IO_Raw or \c - IO_Append, the file is \e not truncated; but if used on - its own (or with \c IO_Truncate), the file is truncated. - \row \i IO_ReadWrite - \i Opens the file in read/write mode, equivalent to \c - (IO_ReadOnly | IO_WriteOnly). - \row \i IO_Append - \i Opens the file in append mode. (You must actually use \c - (IO_WriteOnly | IO_Append) to make the file writable and - to go into append mode.) This mode is very useful when you - want to write something to a log file. The file index is - set to the end of the file. Note that the result is - undefined if you position the file index manually using - at() in append mode. - \row \i IO_Truncate - \i Truncates the file. - \row \i IO_Translate - \i Enables carriage returns and linefeed translation for text - files under Windows. - \endtable - - The raw access mode is best when I/O is block-operated using a 4KB - block size or greater. Buffered access works better when reading - small portions of data at a time. - - \warning When working with buffered files, data may not be written - to the file at once. Call flush() to make sure that the data is - really written. - - \warning If you have a buffered file opened for both reading and - writing you must not perform an input operation immediately after - an output operation or vice versa. You should always call flush() - or a file positioning operation, e.g. at(), between input and - output operations, otherwise the buffer may contain garbage. - - If the file does not exist and \c IO_WriteOnly or \c IO_ReadWrite - is specified, it is created. - - Example: - \code - TQFile f1( "/tmp/data.bin" ); - f1.open( IO_Raw | IO_ReadWrite ); - - TQFile f2( "readme.txt" ); - f2.open( IO_ReadOnly | IO_Translate ); - - TQFile f3( "audit.log" ); - f3.open( IO_WriteOnly | IO_Append ); - \endcode - - \sa name(), close(), isOpen(), flush() -*/ - -bool TQFile::open( int m ) -{ - if ( isOpen() ) { // file already open -#if defined(TQT_CHECK_STATE) - qWarning( "TQFile::open: File already open" ); -#endif - return FALSE; - } - if ( fn.isEmpty() ) { // no file name defined -#if defined(TQT_CHECK_NULL) - qWarning( "TQFile::open: No file name specified" ); -#endif - return FALSE; - } - init(); // reset params - setMode( m ); - if ( !(isReadable() || isWritable()) ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQFile::open: File access not specified" ); -#endif - return FALSE; - } - bool ok = TRUE; - struct stat st; - if ( isRaw() ) { - int oflags = O_RDONLY; - if ( isReadable() && isWritable() ) - oflags = O_RDWR; - else if ( isWritable() ) - oflags = O_WRONLY; - if ( flags() & IO_Append ) { // append to end of file? - if ( flags() & IO_Truncate ) - oflags |= (O_CREAT | O_TRUNC); - else - oflags |= (O_APPEND | O_CREAT); - setFlags( flags() | IO_WriteOnly ); // append implies write - } else if ( isWritable() ) { // create/trunc if writable - if ( flags() & IO_Truncate ) - oflags |= (O_CREAT | O_TRUNC); - else - oflags |= O_CREAT; - } -#if defined(HAS_TEXT_FILEMODE) - if ( isTranslated() ) - oflags |= OPEN_TEXT; - else - oflags |= OPEN_BINARY; -#endif -#if defined(HAS_ASYNC_FILEMODE) - if ( isAsynchronous() ) - oflags |= OPEN_ASYNC; -#endif - fd = qt_open( TQFile::encodeName(fn), oflags, 0666 ); - - if ( fd != -1 ) { // open successful - ::fstat( fd, &st ); // get the stat for later usage - } else { - ok = FALSE; - } - } else { // buffered file I/O - TQCString perm; - char perm2[4]; - bool try_create = FALSE; - if ( flags() & IO_Append ) { // append to end of file? - setFlags( flags() | IO_WriteOnly ); // append implies write - perm = isReadable() ? "a+" : "a"; - } else { - if ( isReadWrite() ) { - if ( flags() & IO_Truncate ) { - perm = "w+"; - } else { - perm = "r+"; - try_create = TRUE; // try to create if not exists - } - } else if ( isReadable() ) { - perm = "r"; - } else if ( isWritable() ) { - perm = "w"; - } - } - qstrcpy( perm2, perm ); -#if defined(HAS_TEXT_FILEMODE) - if ( isTranslated() ) - strcat( perm2, "t" ); - else - strcat( perm2, "b" ); -#endif - for (;;) { // At most twice - - fh = fopen( TQFile::encodeName(fn), perm2 ); - - if ( !fh && try_create ) { - perm2[0] = 'w'; // try "w+" instead of "r+" - try_create = FALSE; - } else { - break; - } - } - if ( fh ) { - ::fstat( fileno(fh), &st ); // get the stat for later usage - } else { - ok = FALSE; - } - } - if ( ok ) { - setState( IO_Open ); - // on successful open the file stat was got; now test what type - // of file we have - if ( (st.st_mode & S_IFMT) != S_IFREG ) { - // non-seekable - setType( IO_Sequential ); - length = INT_MAX; - ioIndex = 0; - } else { -#if defined(TQT_LARGEFILE_SUPPORT) && !defined(TQT_ABI_QT4) - length = st.st_size > UINT_MAX ? UINT_MAX : (Offset)st.st_size; -#else - length = (Offset)st.st_size; -#endif - ioIndex = (flags() & IO_Append) == 0 ? 0 : length; - if ( !(flags()&IO_Truncate) && length == 0 && isReadable() ) { - // try if you can read from it (if you can, it's a sequential - // tqdevice; e.g. a file in the /proc filesystem) - int c = getch(); - if ( c != -1 ) { - ungetch(c); - setType( IO_Sequential ); - length = INT_MAX; - ioIndex = 0; - } - resetqStatus(); - } - } - } else { - init(); - if ( errno == EMFILE ) // no more file handles/descrs - setqStatus( IO_ResourceError ); - else - setqStatus( IO_OpenError ); - setErrorStringErrno( errno ); - } - return ok; -} - -/*! - \overload - Opens a file in the mode \a m using an existing file handle \a f. - Returns TRUE if successful, otherwise FALSE. - - Example: - \code - #include <stdio.h> - - void printError( const char* msg ) - { - TQFile f; - f.open( IO_WriteOnly, stderr ); - f.writeBlock( msg, tqstrlen(msg) ); // write to stderr - f.close(); - } - \endcode - - When a TQFile is opened using this function, close() does not actually - close the file, only flushes it. - - \warning If \a f is \c stdin, \c stdout, \c stderr, you may not - be able to seek. See TQIODevice::isSequentialAccess() for more - information. - - \sa close() -*/ - -bool TQFile::open( int m, FILE *f ) -{ - if ( isOpen() ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQFile::open: File already open" ); -#endif - return FALSE; - } - init(); - setMode( m &~IO_Raw ); - setState( IO_Open ); - fh = f; - ext_f = TRUE; - struct stat st; - ::fstat( fileno(fh), &st ); -#if defined(TQT_LARGEFILE_SUPPORT) -#if !defined(TQT_ABI_QT4) - off_t tmp = ftello( fh ); - ioIndex = tmp > UINT_MAX ? UINT_MAX : (Offset)tmp; -#else - ioIndex = (Offset)ftello( fh ); -#endif -#else - ioIndex = (Offset)ftell( fh ); -#endif - if ( (st.st_mode & S_IFMT) != S_IFREG || f == stdin ) { //stdin is non seekable - // non-seekable - setType( IO_Sequential ); - length = INT_MAX; - ioIndex = 0; - } else { -#if defined(TQT_LARGEFILE_SUPPORT) && !defined(TQT_ABI_QT4) - length = st.st_size > UINT_MAX ? UINT_MAX : (Offset)st.st_size; -#else - length = (Offset)st.st_size; -#endif - if ( !(flags()&IO_Truncate) && length == 0 && isReadable() ) { - // try if you can read from it (if you can, it's a sequential - // tqdevice; e.g. a file in the /proc filesystem) - int c = getch(); - if ( c != -1 ) { - ungetch(c); - setType( IO_Sequential ); - length = INT_MAX; - ioIndex = 0; - } - resetqStatus(); - } - } - return TRUE; -} - -/*! - \overload - Opens a file in the mode \a m using an existing file descriptor \a f. - Returns TRUE if successful, otherwise FALSE. - - When a TQFile is opened using this function, close() does not actually - close the file. - - The TQFile that is opened using this function, is automatically set to be in - raw mode; this means that the file input/output functions are slow. If you - run into performance issues, you should try to use one of the other open - functions. - - \warning If \a f is one of 0 (stdin), 1 (stdout) or 2 (stderr), you may not - be able to seek. size() is set to \c INT_MAX (in limits.h). - - \sa close() -*/ - - -bool TQFile::open( int m, int f ) -{ - if ( isOpen() ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQFile::open: File already open" ); -#endif - return FALSE; - } - init(); - setMode( m |IO_Raw ); - setState( IO_Open ); - fd = f; - ext_f = TRUE; - struct stat st; - ::fstat( fd, &st ); -#if defined(TQT_LARGEFILE_SUPPORT) && !defined(TQT_ABI_QT4) - off_t tmp = ::lseek(fd, 0, SEEK_CUR); - ioIndex = tmp > UINT_MAX ? UINT_MAX : (Offset)tmp; -#else - ioIndex = (Offset)::lseek(fd, 0, SEEK_CUR); -#endif - if ( (st.st_mode & S_IFMT) != S_IFREG || f == 0 ) { // stdin is not seekable... - // non-seekable - setType( IO_Sequential ); - length = INT_MAX; - ioIndex = 0; - } else { -#if defined(TQT_LARGEFILE_SUPPORT) && !defined(TQT_ABI_QT4) - length = st.st_size > UINT_MAX ? UINT_MAX : (Offset)st.st_size; -#else - length = (Offset)st.st_size; -#endif - if ( length == 0 && isReadable() ) { - // try if you can read from it (if you can, it's a sequential - // tqdevice; e.g. a file in the /proc filesystem) - int c = getch(); - if ( c != -1 ) { - ungetch(c); - setType( IO_Sequential ); - length = INT_MAX; - ioIndex = 0; - } - resetqStatus(); - } - } - return TRUE; -} - -/*! - Returns the file size. - \sa at() -*/ - -TQIODevice::Offset TQFile::size() const -{ - struct stat st; - int ret = 0; - if ( isOpen() ) { - ret = ::fstat( fh ? fileno(fh) : fd, &st ); - } else { - ret = ::stat( TQFile::encodeName(fn), &st ); - } - if ( ret == -1 ) - return 0; -#if defined(TQT_LARGEFILE_SUPPORT) && !defined(TQT_ABI_QT4) - return (uint)st.st_size > UINT_MAX ? UINT_MAX : (Offset)st.st_size; -#else - return st.st_size; -#endif -} - - -/*! - \overload - - Sets the file index to \a pos. Returns TRUE if successful; - otherwise returns FALSE. - - Example: - \code - TQFile f( "data.bin" ); - f.open( IO_ReadOnly ); // index set to 0 - f.at( 100 ); // set index to 100 - f.at( f.at()+50 ); // set index to 150 - f.at( f.size()-80 ); // set index to 80 before EOF - f.close(); - \endcode - - Use \c at() without arguments to retrieve the file offset. - - \warning The result is undefined if the file was open()'ed using - the \c IO_Append specifier. - - \sa size(), open() -*/ - -bool TQFile::at( Offset pos ) -{ - if ( !isOpen() ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQFile::at: File is not open" ); -#endif - return FALSE; - } - if ( isSequentialAccess() ) - return FALSE; - bool ok; - if ( isRaw() ) { - off_t l = ::lseek( fd, pos, SEEK_SET ); - ok = ( l != -1 ); - pos = (Offset)l; - } else { // buffered file -#if defined(TQT_LARGEFILE_SUPPORT) - ok = ( ::fseeko(fh, pos, SEEK_SET) == 0 ); -#else - ok = ( ::fseek(fh, pos, SEEK_SET) == 0 ); -#endif - } - if ( ok ) -#if defined(TQT_LARGEFILE_SUPPORT) && !defined(TQT_ABI_QT4) - ioIndex = pos > UINT_MAX ? UINT_MAX : (Offset)pos; -#else - ioIndex = (Offset)pos; -#endif -#if defined(TQT_CHECK_RANGE) - else -#if defined(TQT_ABI_QT4) - qWarning( "TQFile::at: Cannot set file position %lld", pos ); -#else - qWarning( "TQFile::at: Cannot set file position %lu", pos ); -#endif -#endif - return ok; -} - -/*! - \reimp - - \warning We have experienced problems with some C libraries when a buffered - file is opened for both reading and writing. If a read operation takes place - immediately after a write operation, the read buffer contains garbage data. - Worse, the same garbage is written to the file. Calling flush() before - readBlock() solved this problem. -*/ - -TQ_LONG TQFile::readBlock( char *p, TQ_ULONG len ) -{ - if ( !len ) // nothing to do - return 0; - -#if defined(TQT_CHECK_NULL) - if ( !p ) - qWarning( "TQFile::readBlock: Null pointer error" ); -#endif -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { - qWarning( "TQFile::readBlock: File not open" ); - return -1; - } - if ( !isReadable() ) { - qWarning( "TQFile::readBlock: Read operation not permitted" ); - return -1; - } -#endif - TQ_ULONG nread = 0; // number of bytes read - if ( !ungetchBuffer.isEmpty() ) { - // need to add these to the returned string. - uint l = ungetchBuffer.length(); - while( nread < l ) { - *p = ungetchBuffer.at( l - nread - 1 ); - p++; - nread++; - } - ungetchBuffer.truncate( l - nread ); - } - - if ( nread < len ) { - if ( isRaw() ) { // raw file - nread += ::read( fd, p, len-nread ); - if ( len && nread <= 0 ) { - nread = 0; - setqStatus(IO_ReadError); - setErrorStringErrno( errno ); - } - } else { // buffered file - nread += fread( p, 1, len-nread, fh ); - if ( (uint)nread != len ) { - if ( ferror( fh ) || nread==0 ) { - setqStatus(IO_ReadError); - setErrorString( qt_fileerr_read ); - } - } - } - } - if ( !isSequentialAccess() ) - ioIndex += nread; - return nread; -} - - -/*! \reimp - - Writes \a len bytes from \a p to the file and returns the number of - bytes actually written. - - Returns -1 if a serious error occurred. - - \warning When working with buffered files, data may not be written - to the file at once. Call flush() to make sure the data is really - written. - - \sa readBlock() -*/ - -TQ_LONG TQFile::writeBlock( const char *p, TQ_ULONG len ) -{ - if ( !len ) // nothing to do - return 0; - -#if defined(TQT_CHECK_NULL) - if ( p == 0 && len != 0 ) - qWarning( "TQFile::writeBlock: Null pointer error" ); -#endif -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { // file not open - qWarning( "TQFile::writeBlock: File not open" ); - return -1; - } - if ( !isWritable() ) { // writing not permitted - qWarning( "TQFile::writeBlock: Write operation not permitted" ); - return -1; - } -#endif - TQ_ULONG nwritten; // number of bytes written - if ( isRaw() ) // raw file - nwritten = ::write( fd, (void *)p, len ); - else // buffered file - nwritten = fwrite( p, 1, len, fh ); - if ( nwritten != len ) { // write error - if ( errno == ENOSPC ) // disk is full - setqStatus( IO_ResourceError ); - else - setqStatus( IO_WriteError ); - setErrorStringErrno( errno ); - if ( !isSequentialAccess() ) { - if ( isRaw() ) { // recalc file position -#if defined(TQT_LARGEFILE_SUPPORT) && !defined(TQT_ABI_QT4) - off_t tmp = ::lseek( fd, 0, SEEK_CUR ); - ioIndex = tmp > UINT_MAX ? UINT_MAX : (Offset)tmp; -#else - ioIndex = (Offset)::lseek( fd, 0, SEEK_CUR ); -#endif - } else { -#if defined(TQT_LARGEFILE_SUPPORT) -#if !defined(TQT_ABI_QT4) - off_t tmp = (Offset)::fseeko( fh, 0, SEEK_CUR ); - ioIndex = tmp > UINT_MAX ? UINT_MAX : (Offset)tmp; -#else - ioIndex = (Offset)::fseeko( fh, 0, SEEK_CUR ); -#endif -#else - ioIndex = (Offset)::fseek( fh, 0, SEEK_CUR ); -#endif - } - } - } else { - if ( !isSequentialAccess() ) - ioIndex += nwritten; - } - if ( ioIndex > length ) // update file length - length = ioIndex; - return nwritten; -} - -/*! - Returns the file handle of the file. - - This is a small positive integer, suitable for use with C library - functions such as fdopen() and fcntl(). On systems that use file - descriptors for sockets (ie. Unix systems, but not Windows) the handle - can be used with TQSocketNotifier as well. - - If the file is not open or there is an error, handle() returns -1. - - \sa TQSocketNotifier -*/ - -int TQFile::handle() const -{ - if ( !isOpen() ) - return -1; - else if ( fh ) - return fileno( fh ); - else - return fd; -} - -/*! - Closes an open file. - - The file is not closed if it was opened with an existing file handle. - If the existing file handle is a \c FILE*, the file is flushed. - If the existing file handle is an \c int file descriptor, nothing - is done to the file. - - Some "write-behind" filesystems may report an unspecified error on - closing the file. These errors only indicate that something may - have gone wrong since the previous open(). In such a case status() - reports IO_UnspecifiedError after close(), otherwise IO_Ok. - - \sa open(), flush() -*/ - - -void TQFile::close() -{ - bool ok = FALSE; - if ( isOpen() ) { // file is not open - if ( fh ) { // buffered file - if ( ext_f ) - ok = fflush( fh ) != -1; // flush instead of closing - else - ok = fclose( fh ) != -1; - } else { // raw file - if ( ext_f ) - ok = TRUE; // cannot close - else - ok = ::close( fd ) != -1; - } - init(); // restore internal state - } - if (!ok) { - setqStatus( IO_UnspecifiedError ); - setErrorStringErrno( errno ); - } -} - -#endif // USE_QT4
\ No newline at end of file diff --git a/tqtinterface/qt4/src/tools/tqfiledefs_p.h b/tqtinterface/qt4/src/tools/tqfiledefs_p.h deleted file mode 100644 index 3ddd0bb..0000000 --- a/tqtinterface/qt4/src/tools/tqfiledefs_p.h +++ /dev/null @@ -1,67 +0,0 @@ -/**************************************************************************** -** -** Common macros and system include files for TQFile, TQFileInfo and TQDir. -** -** Created : 930812 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQFILEDEFS_P_H -#define TQFILEDEFS_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of qfileinfo*.cpp. This header file may change from version to version -// without notice, or even be removed. -// -// We mean it. -// -// - -// Be sure to include qplatformdefs.h first! -struct TQFileInfoCache -{ -#if defined(TQ_WS_WIN) - TQT_STATBUF st; -#else - struct stat st; -#endif -}; - - -#endif diff --git a/tqtinterface/qt4/src/tools/tqfileinfo.cpp b/tqtinterface/qt4/src/tools/tqfileinfo.cpp deleted file mode 100644 index 0c937eb..0000000 --- a/tqtinterface/qt4/src/tools/tqfileinfo.cpp +++ /dev/null @@ -1,710 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQFileInfo class -** -** Created : 950628 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" - -#include "tqfileinfo.h" -#include "tqdatetime.h" -#include "tqdir.h" -#include "tqfiledefs_p.h" -#include "tqdeepcopy.h" -#if defined(TQT_LARGEFILE_SUPPORT) && !defined(TQT_ABI_QT4) -#include <limits.h> -#endif - - -extern bool qt_file_access( const TQString& fn, int t ); - -/*! - \class TQFileInfo - \reentrant - \brief The TQFileInfo class provides system-independent file information. - - \ingroup io - - TQFileInfo provides information about a file's name and position - (path) in the file system, its access rights and whether it is a - directory or symbolic link, etc. The file's size and last - modified/read times are also available. - - A TQFileInfo can point to a file with either a relative or an - absolute file path. Absolute file paths begin with the directory - separator "/" (or with a drive specification on Windows). Relative - file names begin with a directory name or a file name and specify - a path relative to the current working directory. An example of an - absolute path is the string "/tmp/quartz". A relative path might - look like "src/fatlib". You can use the function isRelative() to - check whether a TQFileInfo is using a relative or an absolute file - path. You can call the function convertToAbs() to convert a - relative TQFileInfo's path to an absolute path. - - The file that the TQFileInfo works on is set in the constructor or - later with setFile(). Use exists() to see if the file exists and - size() to get its size. - - To speed up performance, TQFileInfo caches information about the - file. Because files can be changed by other users or programs, or - even by other parts of the same program, there is a function that - refreshes the file information: refresh(). If you want to switch - off a TQFileInfo's caching and force it to access the file system - every time you request information from it call setCaching(FALSE). - - The file's type is obtained with isFile(), isDir() and - isSymLink(). The readLink() function provides the name of the file - the symlink points to. - - Elements of the file's name can be extracted with dirPath() and - fileName(). The fileName()'s parts can be extracted with - baseName() and extension(). - - The file's dates are returned by created(), lastModified() and - lastRead(). Information about the file's access permissions is - obtained with isReadable(), isWritable() and isExecutable(). The - file's ownership is available from owner(), ownerId(), group() and - groupId(). You can examine a file's permissions and ownership in a - single statement using the permission() function. - - If you need to read and traverse directories, see the TQDir class. -*/ - -/*! - \enum TQFileInfo::PermissionSpec - - This enum is used by the permission() function to report the - permissions and ownership of a file. The values may be OR-ed - together to test multiple permissions and ownership values. - - \value ReadOwner The file is readable by the owner of the file. - \value WriteOwner The file is writable by the owner of the file. - \value ExeOwner The file is executable by the owner of the file. - \value ReadUser The file is readable by the user. - \value WriteUser The file is writable by the user. - \value ExeUser The file is executable by the user. - \value ReadGroup The file is readable by the group. - \value WriteGroup The file is writable by the group. - \value ExeGroup The file is executable by the group. - \value ReadOther The file is readable by anyone. - \value WriteOther The file is writable by anyone. - \value ExeOther The file is executable by anyone. - - \warning The semantics of \c ReadUser, \c WriteUser and \c ExeUser are - unfortunately not platform independent: on Unix, the rights of the owner of - the file are returned and on Windows the rights of the current user are - returned. This behavior might change in a future TQt version. If you want to - find the rights of the owner of the file, you should use the flags \c - ReadOwner, \c WriteOwner and \c ExeOwner. If you want to find out the - rights of the current user, you should use isReadable(), isWritable() and - isExecutable(). -*/ - - -/*! - Constructs a new empty TQFileInfo. -*/ - -TQFileInfo::TQFileInfo() -{ - fic = 0; - cache = TRUE; -#if defined(TQ_OS_UNIX) - symLink = FALSE; -#endif -} - -/*! - Constructs a new TQFileInfo that gives information about the given - file. The \a file can also include an absolute or relative path. - - \warning Some functions might behave in a counter-intuitive way - if \a file has a trailing directory separator. - - \sa setFile(), isRelative(), TQDir::setCurrent(), TQDir::isRelativePath() -*/ - -TQFileInfo::TQFileInfo( const QString &file ) -{ - fn = file; - slashify( fn ); - fic = 0; - cache = TRUE; -#if defined(TQ_OS_UNIX) - symLink = FALSE; -#endif -} - -/*! - Constructs a new TQFileInfo that gives information about file \a - file. - - If the \a file has a relative path, the TQFileInfo will also have a - relative path. - - \sa isRelative() -*/ - -TQFileInfo::TQFileInfo( const TQFile &file ) -{ - fn = file.name(); - slashify( fn ); - fic = 0; - cache = TRUE; -#if defined(TQ_OS_UNIX) - symLink = FALSE; -#endif -} - -/*! - Constructs a new TQFileInfo that gives information about the file - called \a fileName in the directory \a d. - - If \a d has a relative path, the TQFileInfo will also have a - relative path. - - \sa isRelative() -*/ -#ifndef TQT_NO_DIR -TQFileInfo::TQFileInfo( const TQDir &d, const TQString &fileName ) -{ - fn = d.filePath( fileName ); - slashify( fn ); - fic = 0; - cache = TRUE; -#if defined(TQ_OS_UNIX) - symLink = FALSE; -#endif -} -#endif -/*! - Constructs a new TQFileInfo that is a copy of \a fi. -*/ - -TQFileInfo::TQFileInfo( const TQFileInfo &fi ) -{ - fn = fi.fn; - if ( fi.fic ) { - fic = new TQFileInfoCache; - *fic = *fi.fic; - } else { - fic = 0; - } - cache = fi.cache; -#if defined(TQ_OS_UNIX) - symLink = fi.symLink; -#endif -} - -/*! - Destroys the TQFileInfo and frees its resources. -*/ - -TQFileInfo::~TQFileInfo() -{ - delete fic; -} - - -/*! - Makes a copy of \a fi and assigns it to this TQFileInfo. -*/ - -TQFileInfo &TQFileInfo::operator=( const TQFileInfo &fi ) -{ - fn = fi.fn; - if ( !fi.fic ) { - delete fic; - fic = 0; - } else { - if ( !fic ) { - fic = new TQFileInfoCache; - TQ_CHECK_PTR( fic ); - } - *fic = *fi.fic; - } - cache = fi.cache; -#if defined(TQ_OS_UNIX) - symLink = fi.symLink; -#endif - return *this; -} - - -/*! - Sets the file that the TQFileInfo provides information about to \a - file. - - The \a file can also include an absolute or relative file path. - Absolute paths begin with the directory separator (e.g. "/" under - Unix) or a drive specification (under Windows). Relative file - names begin with a directory name or a file name and specify a - path relative to the current directory. - - Example: - \code - TQString absolute = "/local/bin"; - TQString relative = "local/bin"; - TQFileInfo absFile( absolute ); - TQFileInfo relFile( relative ); - - TQDir::setCurrent( TQDir::rootDirPath() ); - // absFile and relFile now point to the same file - - TQDir::setCurrent( "/tmp" ); - // absFile now points to "/local/bin", - // while relFile points to "/tmp/local/bin" - \endcode - - \sa isRelative(), TQDir::setCurrent(), TQDir::isRelativePath() -*/ - -void TQFileInfo::setFile( const TQString &file ) -{ - fn = file; - slashify( fn ); - delete fic; - fic = 0; -} - -/*! - \overload - - Sets the file that the TQFileInfo provides information about to \a - file. - - If \a file includes a relative path, the TQFileInfo will also have - a relative path. - - \sa isRelative() -*/ - -void TQFileInfo::setFile( const TQFile &file ) -{ - fn = file.name(); - slashify( fn ); - delete fic; - fic = 0; -} - -/*! - \overload - - Sets the file that the TQFileInfo provides information about to \a - fileName in directory \a d. - - If \a fileName includes a relative path, the TQFileInfo will also - have a relative path. - - \sa isRelative() -*/ -#ifndef TQT_NO_DIR -void TQFileInfo::setFile( const TQDir &d, const TQString &fileName ) -{ - fn = d.filePath( fileName ); - slashify( fn ); - delete fic; - fic = 0; -} -#endif - -/*! - Returns TRUE if the file exists; otherwise returns FALSE. -*/ - -bool TQFileInfo::exists() const -{ - return qt_file_access( fn, F_OK ); -} - -/*! - Refreshes the information about the file, i.e. reads in information - from the file system the next time a cached property is fetched. - - \sa setCaching() -*/ - -void TQFileInfo::refresh() const -{ - TQFileInfo *that = (TQFileInfo*)this; // Mutable function - delete that->fic; - that->fic = 0; -} - -/*! - \fn bool TQFileInfo::caching() const - - Returns TRUE if caching is enabled; otherwise returns FALSE. - - \sa setCaching(), refresh() -*/ - -/*! - If \a enable is TRUE, enables caching of file information. If \a - enable is FALSE caching is disabled. - - When caching is enabled, TQFileInfo reads the file information from - the file system the first time it's needed, but generally not - later. - - Caching is enabled by default. - - \sa refresh(), caching() -*/ - -void TQFileInfo::setCaching( bool enable ) -{ - if ( cache == enable ) - return; - cache = enable; - if ( cache ) { - delete fic; - fic = 0; - } -} - - -/*! - Returns the file name, including the path (which may be absolute - or relative). - - \sa isRelative(), absFilePath() -*/ - -TQString TQFileInfo::filePath() const -{ - return fn; -} - -/*! - Returns the base name of the file. - - If \a complete is FALSE (the default) the base name consists of - all characters in the file name up to (but not including) the \e - first '.' character. - - If \a complete is TRUE the base name consists of all characters in - the file up to (but not including) the \e last '.' character. - - The path is not included in either case. - - Example: - \code - TQFileInfo fi( "/tmp/archive.tar.gz" ); - TQString base = fi.baseName(); // base = "archive" - base = fi.baseName( TRUE ); // base = "archive.tar" - \endcode - - \sa fileName(), extension() -*/ - -TQString TQFileInfo::baseName( bool complete ) const -{ - TQString tmp = fileName(); - int pos = complete ? tmp.findRev( '.' ) : tmp.find( '.' ); - if ( pos == -1 ) - return tmp; - else - return tmp.left( pos ); -} - -/*! - Returns the file's extension name. - - If \a complete is TRUE (the default), extension() returns the - string of all characters in the file name after (but not - including) the first '.' character. - - If \a complete is FALSE, extension() returns the string of all - characters in the file name after (but not including) the last '.' - character. - - Example: - \code - TQFileInfo fi( "/tmp/archive.tar.gz" ); - TQString ext = fi.extension(); // ext = "tar.gz" - ext = fi.extension( FALSE ); // ext = "gz" - \endcode - - \sa fileName(), baseName() -*/ - -TQString TQFileInfo::extension( bool complete ) const -{ - TQString s = fileName(); - int pos = complete ? s.find( '.' ) : s.findRev( '.' ); - if ( pos < 0 ) - return TQString::tqfromLatin1( "" ); - else - return s.right( s.length() - pos - 1 ); -} - -/*! - Returns the file's path as a TQDir object. - - If the TQFileInfo is relative and \a absPath is FALSE, the TQDir - will be relative; otherwise it will be absolute. - - \sa dirPath(), filePath(), fileName(), isRelative() -*/ -#ifndef TQT_NO_DIR -TQDir TQFileInfo::dir( bool absPath ) const -{ - return TQDir( dirPath(absPath) ); -} -#endif - - -/*! - Returns TRUE if the file is readable; otherwise returns FALSE. - - \sa isWritable(), isExecutable(), permission() -*/ - -bool TQFileInfo::isReadable() const -{ -#ifdef TQ_WS_WIN - return qt_file_access( fn, R_OK ) && permission( ReadUser ); -#else - return qt_file_access( fn, R_OK ); -#endif -} - -/*! - Returns TRUE if the file is writable; otherwise returns FALSE. - - \sa isReadable(), isExecutable(), permission() -*/ - -bool TQFileInfo::isWritable() const -{ -#ifdef TQ_WS_WIN - return qt_file_access( fn, W_OK ) && permission( WriteUser ); -#else - return qt_file_access( fn, W_OK ); -#endif -} - -/*! - Returns TRUE if the file is executable; otherwise returns FALSE. - - \sa isReadable(), isWritable(), permission() -*/ - -bool TQFileInfo::isExecutable() const -{ -#ifdef TQ_WS_WIN -#if defined(_MSC_VER) && _MSC_VER >= 1400 - return permission( ExeUser ); -#else - return qt_file_access( fn, X_OK ) && permission( ExeUser ); -#endif //_MSC_VER >= 1400 -#else - return qt_file_access( fn, X_OK ); -#endif -} - -#ifndef TQ_WS_WIN -bool TQFileInfo::isHidden() const -{ - return fileName()[ 0 ] == TQChar( '.' ); -} -#endif - -/*! - Returns TRUE if the file path name is relative. Returns FALSE if - the path is absolute (e.g. under Unix a path is absolute if it - begins with a "/"). -*/ -#ifndef TQT_NO_DIR -bool TQFileInfo::isRelative() const -{ - return TQDir::isRelativePath( fn ); -} - -/*! - Converts the file's path to an absolute path. - - If it is already absolute, nothing is done. - - \sa filePath(), isRelative() -*/ - -bool TQFileInfo::convertToAbs() -{ - if ( isRelative() ) - fn = absFilePath(); - return TQDir::isRelativePath( fn ); -} -#endif - -/*! - Returns the file size in bytes, or 0 if the file does not exist or - if the size is 0 or if the size cannot be fetched. -*/ -#if defined(TQT_ABI_QT4) -TQIODevice::Offset TQFileInfo::size() const -#else -uint TQFileInfo::size() const -#endif -{ - if ( !fic || !cache ) - doStat(); - if ( fic ) -#if defined(TQT_ABI_QT4) - return (TQIODevice::Offset)fic->st.st_size; -#elif defined(TQT_LARGEFILE_SUPPORT) - return (uint)fic->st.st_size > UINT_MAX ? UINT_MAX : (uint)fic->st.st_size; -#else - return (uint)fic->st.st_size; -#endif - else - return 0; -} - -/*! - Returns the date and time when the file was created. - - On platforms where this information is not available, returns the - same as lastModified(). - - \sa created() lastModified() lastRead() -*/ - -TQDateTime TQFileInfo::created() const -{ - TQDateTime dt; - if ( !fic || !cache ) - doStat(); - if ( fic && fic->st.st_ctime != 0 ) { - dt.setTime_t( fic->st.st_ctime ); - return dt; - } else { - return lastModified(); - } -} - -/*! - Returns the date and time when the file was last modified. - - \sa created() lastModified() lastRead() -*/ - -TQDateTime TQFileInfo::lastModified() const -{ - TQDateTime dt; - if ( !fic || !cache ) - doStat(); - if ( fic ) - dt.setTime_t( fic->st.st_mtime ); - return dt; -} - -/*! - Returns the date and time when the file was last read (accessed). - - On platforms where this information is not available, returns the - same as lastModified(). - - \sa created() lastModified() lastRead() -*/ - -TQDateTime TQFileInfo::lastRead() const -{ - TQDateTime dt; - if ( !fic || !cache ) - doStat(); - if ( fic && fic->st.st_atime != 0 ) { - dt.setTime_t( fic->st.st_atime ); - return dt; - } else { - return lastModified(); - } -} - -#ifndef TQT_NO_DIR - -/*! - Returns the absolute path including the file name. - - The absolute path name consists of the full path and the file - name. On Unix this will always begin with the root, '/', - directory. On Windows this will always begin 'D:/' where D is a - drive letter, except for network shares that are not mapped to a - drive letter, in which case the path will begin '//sharename/'. - - This function returns the same as filePath(), unless isRelative() - is TRUE. - - If the TQFileInfo is empty it returns TQDir::currentDirPath(). - - This function can be time consuming under Unix (in the order of - milliseconds). - - \sa isRelative(), filePath() -*/ -TQString TQFileInfo::absFilePath() const -{ - TQString tmp; - if ( TQDir::isRelativePath(fn) -#if defined(TQ_OS_WIN32) - && fn[1] != ':' -#endif - ) { - tmp = TQDir::currentDirPath(); - tmp += '/'; - } - tmp += fn; - makeAbs( tmp ); - return TQDir::cleanDirPath( tmp ); -} - -/*! \internal - Detaches all internal data. -*/ -void TQFileInfo::detach() -{ - fn = TQDeepCopy<TQString>( fn ); - if ( fic ) { - TQFileInfoCache *cur = fic; - fic = new TQFileInfoCache; - *fic = *cur; - delete cur; - } -} - -#endif diff --git a/tqtinterface/qt4/src/tools/tqfileinfo.h b/tqtinterface/qt4/src/tools/tqfileinfo.h deleted file mode 100644 index b87b2ad..0000000 --- a/tqtinterface/qt4/src/tools/tqfileinfo.h +++ /dev/null @@ -1,157 +0,0 @@ -/**************************************************************************** -** -** Definition of TQFileInfo class -** -** Created : 950628 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQFILEINFO_H -#define TQFILEINFO_H - -#ifndef TQT_H -#include "tqfile.h" -#include "tqdatetime.h" -#endif // TQT_H - - -class TQDir; -struct TQFileInfoCache; -template <class T> class TQDeepCopy; - - -class TQ_EXPORT TQFileInfo -{ -public: - enum PermissionSpec { - ReadOwner = 04000, WriteOwner = 02000, ExeOwner = 01000, - ReadUser = 00400, WriteUser = 00200, ExeUser = 00100, - ReadGroup = 00040, WriteGroup = 00020, ExeGroup = 00010, - ReadOther = 00004, WriteOther = 00002, ExeOther = 00001 }; - - TQFileInfo(); - TQFileInfo( const QString &file ); - TQFileInfo( const TQFile & ); -#ifndef TQT_NO_DIR - TQFileInfo( const TQDir &, const TQString &fileName ); -#endif - TQFileInfo( const TQFileInfo & ); - ~TQFileInfo(); - - TQFileInfo &operator=( const TQFileInfo & ); - - void setFile( const TQString &file ); - void setFile( const TQFile & ); -#ifndef TQT_NO_DIR - void setFile( const TQDir &, const TQString &fileName ); -#endif - bool exists() const; - void refresh() const; - bool caching() const; - void setCaching( bool ); - - TQString filePath() const; - TQString fileName() const; -#ifndef TQT_NO_DIR //### - TQString absFilePath() const; -#endif - TQString baseName( bool complete = FALSE ) const; - TQString extension( bool complete = TRUE ) const; - -#ifndef TQT_NO_DIR //### - TQString dirPath( bool absPath = FALSE ) const; -#endif -#ifndef TQT_NO_DIR - TQDir dir( bool absPath = FALSE ) const; -#endif - bool isReadable() const; - bool isWritable() const; - bool isExecutable() const; - bool isHidden() const; - -#ifndef TQT_NO_DIR //### - bool isRelative() const; - bool convertToAbs(); -#endif - - bool isFile() const; - bool isDir() const; - bool isSymLink() const; - - TQString readLink() const; - - TQString owner() const; - uint ownerId() const; - TQString group() const; - uint groupId() const; - - bool permission( int permissionSpec ) const; - -#if (TQT_VERSION-0 >= 0x040000) -#error "TQFileInfo::size() should return TQIODevice::Offset instead of uint" -#elif defined(TQT_ABI_QT4) - TQIODevice::Offset size() const; -#else - uint size() const; -#endif - - TQDateTime created() const; - TQDateTime lastModified() const; - TQDateTime lastRead() const; - -private: - void doStat() const; - static void slashify( TQString & ); - static void makeAbs( TQString & ); - - TQString fn; - TQFileInfoCache *fic; - bool cache; -#if defined(TQ_OS_UNIX) - bool symLink; -#endif - - void detach(); - friend class TQDeepCopy< TQFileInfo >; -}; - - -inline bool TQFileInfo::caching() const -{ - return cache; -} - - -#endif // TQFILEINFO_H diff --git a/tqtinterface/qt4/src/tools/tqfileinfo_unix.cpp b/tqtinterface/qt4/src/tools/tqfileinfo_unix.cpp deleted file mode 100644 index dcde72a..0000000 --- a/tqtinterface/qt4/src/tools/tqfileinfo_unix.cpp +++ /dev/null @@ -1,400 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQFileInfo class -** -** Created : 950628 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" -#include "tqfileinfo.h" -#include "tqfiledefs_p.h" -#include "tqdatetime.h" -#include "tqdir.h" - -#include <limits.h> -#if !defined(TQWS) && defined(TQ_OS_MAC) -# include <tqt_mac.h> -#endif -#if defined(Q_OS_HURD) -# include <stdlib.h> -#endif - -void TQFileInfo::slashify( TQString& ) -{ - return; -} - - -void TQFileInfo::makeAbs( TQString & ) -{ - return; -} - -/*! - Returns TRUE if this object points to a file. Returns FALSE if the - object points to something which isn't a file, e.g. a directory or - a symlink. - - \sa isDir(), isSymLink() -*/ -bool TQFileInfo::isFile() const -{ - if ( !fic || !cache ) - doStat(); - return fic ? (fic->st.st_mode & S_IFMT) == S_IFREG : FALSE; -} - -/*! - Returns TRUE if this object points to a directory or to a symbolic - link to a directory; otherwise returns FALSE. - - \sa isFile(), isSymLink() -*/ -bool TQFileInfo::isDir() const -{ - if ( !fic || !cache ) - doStat(); - return fic ? (fic->st.st_mode & S_IFMT) == S_IFDIR : FALSE; -} - -/*! - Returns TRUE if this object points to a symbolic link (or to a - shortcut on Windows, or an alias on Mac OS X); otherwise returns - FALSE. - - \sa isFile(), isDir(), readLink() -*/ - -bool TQFileInfo::isSymLink() const -{ - if ( !fic || !cache ) - doStat(); - if(symLink) - return TRUE; -#if !defined(TQWS) && defined(TQ_OS_MAC) - { - FSRef fref; - if(FSPathMakeRef((const UInt8 *)TQFile::encodeName(fn).data(), &fref, NULL) == noErr) { - Boolean isAlias, isFolder; - if(FSIsAliasFile(&fref, &isAlias, &isFolder) == noErr) - return isAlias; - } - } -#endif - return FALSE; -} - -/*! - Returns the name a symlink (or shortcut on Windows) points to, or - a TQString::null if the object isn't a symbolic link. - - This name may not represent an existing file; it is only a string. - TQFileInfo::exists() returns TRUE if the symlink points to an - existing file. - - \sa exists(), isSymLink(), isDir(), isFile() -*/ - -TQString TQFileInfo::readLink() const -{ - if ( !isSymLink() ) - return TQString(); -#if defined(TQ_OS_UNIX) && !defined(TQ_OS_OS2EMX) -#if defined(__GLIBC__) && !defined(PATH_MAX) - int size = 256; - char *s = NULL, *s2; - - while (1) - { - s2 = (char *) realloc (s, size); - if (s2 == NULL) { - free( s ); - return TQString(); - } - s = s2; - int len = readlink ( TQFile::encodeName(fn).data(), s, size ); - if ( len < 0 ) { - free( s ); - return TQString(); - } - if ( len < size ) { - s[len] = '\0'; - TQString str = TQFile::decodeName(s); - free(s); - return str; - } - size *= 2; - } -#else - char s[PATH_MAX+1]; - int len = readlink( TQFile::encodeName(fn).data(), s, PATH_MAX ); - if ( len >= 0 ) { - s[len] = '\0'; - return TQFile::decodeName(s); - } -#endif /* __GLIBC__ && !PATH_MAX */ -#endif /* Q_OS_UNIX && !Q_OS_OS2EMX */ -#if !defined(TQWS) && defined(TQ_OS_MAC) - { - FSRef fref; - if(FSPathMakeRef((const UInt8 *)TQFile::encodeName(fn).data(), &fref, NULL) == noErr) { - Boolean isAlias, isFolder; - if(FSResolveAliasFile(&fref, TRUE, &isFolder, &isAlias) == noErr && isAlias) { - AliasHandle alias; - if(FSNewAlias(0, &fref, &alias) == noErr && alias) { - CFStringRef cfstr; - if(FSCopyAliasInfo(alias, 0, 0, &cfstr, 0, 0) == noErr) { - TQString cfstring2qstring(CFStringRef str); //qglobal.cpp - return cfstring2qstring(cfstr); - } - } - } - } - } -#endif - return TQString(); -} - -static const uint nobodyID = (uint) -2; - -/*! - Returns the owner of the file. On systems where files - do not have owners, or if an error occurs, TQString::null is - returned. - - This function can be time consuming under Unix (in the order of - milliseconds). - - \sa ownerId(), group(), groupId() -*/ - -TQString TQFileInfo::owner() const -{ - passwd *pw = getpwuid( ownerId() ); - if ( pw ) - return TQFile::decodeName( pw->pw_name ); - return TQString::null; -} - -/*! - Returns the id of the owner of the file. - - On Windows and on systems where files do not have owners this - function returns ((uint) -2). - - \sa owner(), group(), groupId() -*/ - -uint TQFileInfo::ownerId() const -{ - if ( !fic || !cache ) - doStat(); - if ( fic ) - return fic->st.st_uid; - return nobodyID; -} - -/*! - Returns the group of the file. On Windows, on systems where files - do not have groups, or if an error occurs, TQString::null is - returned. - - This function can be time consuming under Unix (in the order of - milliseconds). - - \sa groupId(), owner(), ownerId() -*/ - -TQString TQFileInfo::group() const -{ - struct group *gr = getgrgid( groupId() ); - if ( gr ) - return TQFile::decodeName( gr->gr_name ); - return TQString::null; -} - -/*! - Returns the id of the group the file belongs to. - - On Windows and on systems where files do not have groups this - function always returns (uint) -2. - - \sa group(), owner(), ownerId() -*/ - -uint TQFileInfo::groupId() const -{ - if ( !fic || !cache ) - doStat(); - if ( fic ) - return fic->st.st_gid; - return nobodyID; -} - - -/*! - Tests for file permissions. The \a permissionSpec argument can be - several flags of type \c PermissionSpec OR-ed together to check - for permission combinations. - - On systems where files do not have permissions this function - always returns TRUE. - - Example: - \code - TQFileInfo fi( "/tmp/archive.tar.gz" ); - if ( fi.permission( TQFileInfo::WriteUser | TQFileInfo::ReadGroup ) ) - qWarning( "I can change the file; my group can read the file" ); - if ( fi.permission( TQFileInfo::WriteGroup | TQFileInfo::WriteOther ) ) - qWarning( "The group or others can change the file" ); - \endcode - - \sa isReadable(), isWritable(), isExecutable() -*/ - -bool TQFileInfo::permission( int permissionSpec ) const -{ - if ( !fic || !cache ) - doStat(); - if ( fic ) { - uint mask = 0; - if ( permissionSpec & ReadOwner ) - mask |= S_IRUSR; - if ( permissionSpec & WriteOwner ) - mask |= S_IWUSR; - if ( permissionSpec & ExeOwner ) - mask |= S_IXUSR; - if ( permissionSpec & ReadUser ) - mask |= S_IRUSR; - if ( permissionSpec & WriteUser ) - mask |= S_IWUSR; - if ( permissionSpec & ExeUser ) - mask |= S_IXUSR; - if ( permissionSpec & ReadGroup ) - mask |= S_IRGRP; - if ( permissionSpec & WriteGroup ) - mask |= S_IWGRP; - if ( permissionSpec & ExeGroup ) - mask |= S_IXGRP; - if ( permissionSpec & ReadOther ) - mask |= S_IROTH; - if ( permissionSpec & WriteOther ) - mask |= S_IWOTH; - if ( permissionSpec & ExeOther ) - mask |= S_IXOTH; - if ( mask ) { - return (fic->st.st_mode & mask) == mask; - } else { -#if defined(TQT_CHECK_NULL) - qWarning( "TQFileInfo::permission: permissionSpec is 0" ); -#endif - return TRUE; - } - } else { - return FALSE; - } -} - -void TQFileInfo::doStat() const -{ - TQFileInfo *that = ((TQFileInfo*)this); // mutable function - if ( !that->fic ) - that->fic = new TQFileInfoCache; - that->symLink = FALSE; - struct stat *b = &that->fic->st; -#if defined(TQ_OS_UNIX) && defined(S_IFLNK) - if ( ::lstat( TQFile::encodeName(fn), b ) == 0 ) { - if ( S_ISLNK( b->st_mode ) ) - that->symLink = TRUE; - else - return; - } -#endif - - int r = ::stat( TQFile::encodeName(fn), b ); - if ( r != 0 && !that->symLink ) { - delete that->fic; - that->fic = 0; - } -} - -/*! - Returns the file's path. - - If \a absPath is TRUE an absolute path is returned. - - \sa dir(), filePath(), fileName(), isRelative() -*/ -#ifndef TQT_NO_DIR -TQString TQFileInfo::dirPath( bool absPath ) const -{ - TQString s; - if ( absPath ) - s = absFilePath(); - else - s = fn; - int pos = s.findRev( '/' ); - if ( pos == -1 ) { - return TQString::tqfromLatin1( "." ); - } else { - if ( pos == 0 ) - return TQString::tqfromLatin1( "/" ); - return s.left( pos ); - } -} -#endif - -/*! - Returns the name of the file, excluding the path. - - Example: - \code - TQFileInfo fi( "/tmp/archive.tar.gz" ); - TQString name = fi.fileName(); // name = "archive.tar.gz" - \endcode - - \sa isRelative(), filePath(), baseName(), extension() -*/ - -TQString TQFileInfo::fileName() const -{ - int p = fn.findRev( '/' ); - if ( p == -1 ) { - return fn; - } else { - return fn.mid( p + 1 ); - } -} diff --git a/tqtinterface/qt4/src/tools/tqgarray.cpp b/tqtinterface/qt4/src/tools/tqgarray.cpp deleted file mode 100644 index ca26750..0000000 --- a/tqtinterface/qt4/src/tools/tqgarray.cpp +++ /dev/null @@ -1,830 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQGArray class -** -** Created : 930906 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqglobal.h" -#if defined(TQ_CC_BOR) - // needed for qsort() because of a std namespace problem on Borland -# include "tqplatformdefs.h" -#elif defined(TQ_WS_WIN) - // needed for bsearch on some platforms -# include "tqt_windows.h" -#endif - -#define TQGARRAY_CPP -#include "tqgarray.h" -#include <stdlib.h> -#include <string.h> - -#ifdef TQT_THREAD_SUPPORT -# include <private/tqmutexpool_p.h> -#endif // TQT_THREAD_SUPPORT - -/* - If USE_MALLOC isn't defined, we use new[] and delete[] to allocate - memory. The documentation for TQMemArray<T>::assign() explicitly - mentions that the array is freed using free(), so don't mess around - with USE_MALLOC unless you know what you're doing. -*/ -#define USE_MALLOC - -#undef NEW -#undef DELETE - -#if defined(USE_MALLOC) -#define NEW(type,size) ((type*)malloc(size*sizeof(type))) -#define DELETE(array) (free((char*)array)) -#else -#define NEW(type,size) (new type[size]) -#define DELETE(array) (delete[] array) -#define DONT_USE_REALLOC // comment to use realloc() -#endif - -/*! - \class TQShared tqshared.h - \reentrant - \ingroup shared - \brief The TQShared class is used internally for implementing shared classes. - - \internal - - It only contains a reference count and member functions to increment and - decrement it. - - Shared classes normally have internal classes that inherit TQShared and - add the shared data. - - \sa \link shclass.html Shared Classes\endlink -*/ - -/*! - \class TQGArray tqgarray.h - \reentrant - \ingroup shared - \ingroup collection - \brief The TQGArray class is an internal class for implementing the TQMemArray class. - - \internal - - TQGArray is a strictly internal class that acts as base class for the - TQMemArray template array. - - It contains an array of bytes and has no notion of an array element. -*/ - - -/*! - Constructs a null array. -*/ - -TQGArray::TQGArray() -{ - shd = newData(); - TQ_CHECK_PTR( shd ); -} - -/*! - Dummy constructor; does not allocate any data. - - This constructor does not initialize any array data so subclasses - must do it. The intention is to make the code more efficient. -*/ - -TQGArray::TQGArray( int, int ) -{ -} - -/*! - Constructs an array with room for \a size bytes. -*/ - -TQGArray::TQGArray( int size ) -{ - if ( size < 0 ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQGArray: Cannot allocate array with negative length" ); -#endif - size = 0; - } - shd = newData(); - TQ_CHECK_PTR( shd ); - if ( size == 0 ) // zero length - return; - shd->data = NEW(char,size); - TQ_CHECK_PTR( shd->data ); - shd->len = -#ifdef TQT_TQGARRAY_SPEED_OPTIM - shd->maxl = -#endif - size; -} - -/*! - Constructs a shallow copy of \a a. -*/ - -TQGArray::TQGArray( const TQGArray &a ) -{ - shd = a.shd; - shd->ref(); -} - -/*! - Dereferences the array data and deletes it if this was the last - reference. -*/ - -TQGArray::~TQGArray() -{ - if ( shd && shd->deref() ) { // delete when last reference - if ( shd->data ) // is lost - DELETE(shd->data); - deleteData( shd ); - shd = 0; - } -} - - -/*! - \fn TQGArray &TQGArray::operator=( const TQGArray &a ) - - Assigns a shallow copy of \a a to this array and returns a reference to - this array. Equivalent to assign(). -*/ - -/*! - \fn void TQGArray::detach() - - Detaches this array from shared array data. -*/ - -/*! - \fn char *TQGArray::data() const - - Returns a pointer to the actual array data. -*/ - -/*! - \fn uint TQGArray::nrefs() const - - Returns the reference count. -*/ - -/*! - \fn uint TQGArray::size() const - - Returns the size of the array, in bytes. -*/ - - -/*! - Returns TRUE if this array is equal to \a a, otherwise FALSE. - The comparison is bitwise, of course. -*/ - -bool TQGArray::isEqual( const TQGArray &a ) const -{ - if ( size() != a.size() ) // different size - return FALSE; - if ( data() == a.data() ) // has same data - return TRUE; - return (size() ? memcmp( data(), a.data(), size() ) : 0) == 0; -} - - -/*! - Resizes the array to \a newsize bytes. \a optim is either - \c MemOptim (the default) or \c SpeedOptim. - - <b>Note:</b> \c SpeedOptim is only available if TQt is built in a - particular configuration. By default, \c SpeedOptim is not available - for general use. -*/ -bool TQGArray::resize( uint newsize, Optimization optim ) -{ -#ifndef TQT_TQGARRAY_SPEED_OPTIM - TQ_UNUSED(optim); -#endif - - if ( newsize == shd->len -#ifdef TQT_TQGARRAY_SPEED_OPTIM - && newsize == shd->maxl -#endif - ) // nothing to do - return TRUE; - if ( newsize == 0 ) { // remove array - if ( shd->data ) - DELETE(shd->data); - shd->data = 0; - shd->len = 0; -#ifdef TQT_TQGARRAY_SPEED_OPTIM - shd->maxl = 0; -#endif - return TRUE; - } - - uint newmaxl = newsize; -#ifdef TQT_TQGARRAY_SPEED_OPTIM - if ( optim == SpeedOptim ) { - if ( newsize <= shd->maxl && - ( newsize * 4 > shd->maxl || shd->maxl <= 4 ) ) { - shd->len = newsize; - return TRUE; - } - newmaxl = 4; - while ( newmaxl < newsize ) - newmaxl *= 2; - // try to spare some memory - if ( newmaxl >= 1024 * 1024 && newsize <= newmaxl - (newmaxl >> 2) ) - newmaxl -= newmaxl >> 2; - } - shd->maxl = newmaxl; -#endif - - if ( shd->data ) { // existing data -#if defined(DONT_USE_REALLOC) - char *newdata = NEW(char,newsize); // manual realloc - memcpy( newdata, shd->data, TQMIN(shd->len,newmaxl) ); - DELETE(shd->data); - shd->data = newdata; -#else - shd->data = (char *)realloc( shd->data, newmaxl ); -#endif - } else { - shd->data = NEW(char,newmaxl); - } - if ( !shd->data ) // no memory - return FALSE; - shd->len = newsize; - return TRUE; -} - -/*!\overload -*/ -bool TQGArray::resize( uint newsize ) -{ - return resize( newsize, MemOptim ); -} - - -/*! - Fills the array with the repeated occurrences of \a d, which is - \a sz bytes long. - If \a len is specified as different from -1, then the array will be - resized to \a len*sz before it is filled. - - Returns TRUE if successful, or FALSE if the memory cannot be allocated - (only when \a len != -1). - - \sa resize() -*/ - -bool TQGArray::fill( const char *d, int len, uint sz ) -{ - if ( len < 0 ) - len = shd->len/sz; // default: use array length - else if ( !resize( len*sz ) ) - return FALSE; - if ( sz == 1 ) // 8 bit elements - memset( data(), *d, len ); - else if ( sz == 4 ) { // 32 bit elements - register TQ_INT32 *x = (TQ_INT32*)data(); - TQ_INT32 v = *((TQ_INT32*)d); - while ( len-- ) - *x++ = v; - } else if ( sz == 2 ) { // 16 bit elements - register TQ_INT16 *x = (TQ_INT16*)data(); - TQ_INT16 v = *((TQ_INT16*)d); - while ( len-- ) - *x++ = v; - } else { // any other size elements - register char *x = data(); - while ( len-- ) { // more complicated - memcpy( x, d, sz ); - x += sz; - } - } - return TRUE; -} - -/*! - \overload - Shallow copy. Dereference the current array and references the data - contained in \a a instead. Returns a reference to this array. - \sa operator=() -*/ - -TQGArray &TQGArray::assign( const TQGArray &a ) -{ - a.shd->ref(); // avoid 'a = a' - if ( shd->deref() ) { // delete when last reference - if ( shd->data ) // is lost - DELETE(shd->data); - deleteData( shd ); - } - shd = a.shd; - return *this; -} - -/*! - Shallow copy. Dereference the current array and references the - array data \a d, which contains \a len bytes. - Returns a reference to this array. - - Do not delete \a d later, because TQGArray takes care of that. -*/ - -TQGArray &TQGArray::assign( const char *d, uint len ) -{ - if ( shd->count > 1 ) { // disconnect this - shd->count--; - shd = newData(); - TQ_CHECK_PTR( shd ); - } else { - if ( shd->data ) - DELETE(shd->data); - } - shd->data = (char *)d; - shd->len = -#ifdef TQT_TQGARRAY_SPEED_OPTIM - shd->maxl = -#endif - len; - return *this; -} - -/*! - Deep copy. Dereference the current array and obtains a copy of the data - contained in \a a instead. Returns a reference to this array. - \sa assign(), operator=() -*/ - -TQGArray &TQGArray::duplicate( const TQGArray &a ) -{ - if ( a.shd == shd ) { // a.duplicate(a) ! - if ( shd->count > 1 ) { - shd->count--; - register array_data *n = newData(); - TQ_CHECK_PTR( n ); - if ( (n->len=shd->len) ) { - n->data = NEW(char,n->len); - TQ_CHECK_PTR( n->data ); - if ( n->data ) - memcpy( n->data, shd->data, n->len ); - } else { - n->data = 0; - } - shd = n; - } - return *this; - } - char *oldptr = 0; - if ( shd->count > 1 ) { // disconnect this - shd->count--; - shd = newData(); - TQ_CHECK_PTR( shd ); - } else { // delete after copy was made - oldptr = shd->data; - } - if ( a.shd->len ) { // duplicate data - shd->data = NEW(char,a.shd->len); - TQ_CHECK_PTR( shd->data ); - if ( shd->data ) - memcpy( shd->data, a.shd->data, a.shd->len ); - } else { - shd->data = 0; - } - shd->len = -#ifdef TQT_TQGARRAY_SPEED_OPTIM - shd->maxl = -#endif - a.shd->len; - if ( oldptr ) - DELETE(oldptr); - return *this; -} - -/*! - \overload - Deep copy. Dereferences the current array and obtains a copy of - \a len characters from array data \a d instead. Returns a reference - to this array. - \sa assign(), operator=() -*/ - -TQGArray &TQGArray::duplicate( const char *d, uint len ) -{ - char *data; - if ( d == 0 || len == 0 ) { - data = 0; - len = 0; - } else { - if ( shd->count == 1 && shd->len == len ) { - if ( shd->data != d ) // avoid self-assignment - memcpy( shd->data, d, len ); // use same buffer - return *this; - } - data = NEW(char,len); - TQ_CHECK_PTR( data ); - memcpy( data, d, len ); - } - if ( shd->count > 1 ) { // detach - shd->count--; - shd = newData(); - TQ_CHECK_PTR( shd ); - } else { // just a single reference - if ( shd->data ) - DELETE(shd->data); - } - shd->data = data; - shd->len = -#ifdef TQT_TQGARRAY_SPEED_OPTIM - shd->maxl = -#endif - len; - return *this; -} - -/*! - Resizes this array to \a len bytes and copies the \a len bytes at - address \a d into it. - - \warning This function disregards the reference count mechanism. If - other TQGArrays reference the same data as this, all will be updated. -*/ - -void TQGArray::store( const char *d, uint len ) -{ // store, but not deref - resize( len ); - memcpy( shd->data, d, len ); -} - - -/*! - \fn array_data *TQGArray::sharedBlock() const - - Returns a pointer to the shared array block. - - \warning - - Do not use this function. Using it is begging for trouble. We dare - not remove it, for fear of breaking code, but we \e strongly - discourage new use of it. -*/ - -/*! - \fn void TQGArray::setSharedBlock( array_data *p ) - - Sets the shared array block to \a p. - - \warning - - Do not use this function. Using it is begging for trouble. We dare - not remove it, for fear of breaking code, but we \e strongly - discourage new use of it. -*/ - - -/*! - Sets raw data and returns a reference to the array. - - Dereferences the current array and sets the new array data to \a d and - the new array size to \a len. Do not attempt to resize or re-assign the - array data when raw data has been set. - Call resetRawData(d,len) to reset the array. - - Setting raw data is useful because it sets TQMemArray data without - allocating memory or copying data. - - Example of intended use: - \code - static uchar bindata[] = { 231, 1, 44, ... }; - TQByteArray a; - a.setRawData( bindata, sizeof(bindata) ); // a points to bindata - TQDataStream s( a, IO_ReadOnly ); // open on a's data - s >> <something>; // read raw bindata - s.close(); - a.resetRawData( bindata, sizeof(bindata) ); // finished - \endcode - - Example of misuse (do not do this): - \code - static uchar bindata[] = { 231, 1, 44, ... }; - TQByteArray a, b; - a.setRawData( bindata, sizeof(bindata) ); // a points to bindata - a.resize( 8 ); // will crash - b = a; // will crash - a[2] = 123; // might crash - // forget to resetRawData - will crash - \endcode - - \warning If you do not call resetRawData(), TQGArray will attempt to - deallocate or reallocate the raw data, which might not be too good. - Be careful. -*/ - -TQGArray &TQGArray::setRawData( const char *d, uint len ) -{ - duplicate( 0, 0 ); // set null data - shd->data = (char *)d; - shd->len = len; - return *this; -} - -/*! - Resets raw data. - - The arguments must be the data, \a d, and length \a len, that were - passed to setRawData(). This is for consistency checking. -*/ - -void TQGArray::resetRawData( const char *d, uint len ) -{ - if ( d != shd->data || len != shd->len ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQGArray::resetRawData: Inconsistent arguments" ); -#endif - return; - } - shd->data = 0; - shd->len = 0; -} - - -/*! - Finds the first occurrence of \a d in the array from position \a index, - where \a sz is the size of the \a d element. - - Note that \a index is given in units of \a sz, not bytes. - - This function only compares whole cells, not bytes. -*/ - -int TQGArray::find( const char *d, uint index, uint sz ) const -{ - index *= sz; - if ( index >= shd->len ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQGArray::find: Index %d out of range", index/sz ); -#endif - return -1; - } - register uint i; - uint ii; - switch ( sz ) { - case 1: { // 8 bit elements - register char *x = data() + index; - char v = *d; - for ( i=index; i<shd->len; i++ ) { - if ( *x++ == v ) - break; - } - ii = i; - } - break; - case 2: { // 16 bit elements - register TQ_INT16 *x = (TQ_INT16*)(data() + index); - TQ_INT16 v = *((TQ_INT16*)d); - for ( i=index; i<shd->len; i+=2 ) { - if ( *x++ == v ) - break; - } - ii = i/2; - } - break; - case 4: { // 32 bit elements - register TQ_INT32 *x = (TQ_INT32*)(data() + index); - TQ_INT32 v = *((TQ_INT32*)d); - for ( i=index; i<shd->len; i+=4 ) { - if ( *x++ == v ) - break; - } - ii = i/4; - } - break; - default: { // any size elements - for ( i=index; i<shd->len; i+=sz ) { - if ( memcmp( d, &shd->data[i], sz ) == 0 ) - break; - } - ii = i/sz; - } - break; - } - return i<shd->len ? (int)ii : -1; -} - -/*! - Returns the number of occurrences of \a d in the array, where \a sz is - the size of the \a d element. - - This function only compares whole cells, not bytes. -*/ - -int TQGArray::contains( const char *d, uint sz ) const -{ - register uint i = shd->len; - int count = 0; - switch ( sz ) { - case 1: { // 8 bit elements - register char *x = data(); - char v = *d; - while ( i-- ) { - if ( *x++ == v ) - count++; - } - } - break; - case 2: { // 16 bit elements - register TQ_INT16 *x = (TQ_INT16*)data(); - TQ_INT16 v = *((TQ_INT16*)d); - i /= 2; - while ( i-- ) { - if ( *x++ == v ) - count++; - } - } - break; - case 4: { // 32 bit elements - register TQ_INT32 *x = (TQ_INT32*)data(); - TQ_INT32 v = *((TQ_INT32*)d); - i /= 4; - while ( i-- ) { - if ( *x++ == v ) - count++; - } - } - break; - default: { // any size elements - for ( i=0; i<shd->len; i+=sz ) { - if ( memcmp(d, &shd->data[i], sz) == 0 ) - count++; - } - } - break; - } - return count; -} - -static int cmp_item_size = 0; - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif - -#ifdef TQ_OS_TEMP -static int __cdecl cmp_arr( const void *n1, const void *n2 ) -#else -static int cmp_arr( const void *n1, const void *n2 ) -#endif -{ - return ( n1 && n2 ) ? memcmp( n1, n2, cmp_item_size ) - : ( n1 ? 1 : ( n2 ? -1 : 0 ) ); - // ### TQt 3.0: Add a virtual compareItems() method and call that instead -} - -#if defined(TQ_C_CALLBACKS) -} -#endif - -/*! - Sorts the first \a sz items of the array. -*/ - -void TQGArray::sort( uint sz ) -{ - int numItems = size() / sz; - if ( numItems < 2 ) - return; - -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker locker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &cmp_item_size ) : 0 ); -#endif // TQT_THREAD_SUPPORT - - cmp_item_size = sz; - qsort( shd->data, numItems, sz, cmp_arr ); -} - -/*! - Binary search; assumes that \a d is a sorted array of size \a sz. -*/ - -int TQGArray::bsearch( const char *d, uint sz ) const -{ - int numItems = size() / sz; - if ( !numItems ) - return -1; - -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker locker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &cmp_item_size ) : 0 ); -#endif // TQT_THREAD_SUPPORT - - cmp_item_size = sz; - char* r = (char*)::bsearch( d, shd->data, numItems, sz, cmp_arr ); - if ( !r ) - return -1; - while( (r >= shd->data + sz) && (cmp_arr( r - sz, d ) == 0) ) - r -= sz; // search to first of equal elements; bsearch is undef - return (int)(( r - shd->data ) / sz); -} - - -/*! - \fn char *TQGArray::at( uint index ) const - - Returns a pointer to the byte at offset \a index in the array. -*/ - -/*! - Expand the array if necessary, and copies (the first part of) its - contents from the \a index * \a sz bytes at \a d. - - Returns TRUE if the operation succeeds, FALSE if it runs out of - memory. - - \warning This function disregards the reference count mechanism. If - other TQGArrays reference the same data as this, all will be changed. -*/ - -bool TQGArray::setExpand( uint index, const char *d, uint sz ) -{ - index *= sz; - if ( index >= shd->len ) { - if ( !resize( index+sz ) ) // no memory - return FALSE; - } - memcpy( data() + index, d, sz ); - return TRUE; -} - - -/*! - Prints a warning message if at() or [] is given a bad index. -*/ - -void TQGArray::msg_index( uint index ) -{ -#if defined(TQT_CHECK_RANGE) - qWarning( "TQGArray::at: Absolute index %d out of range", index ); -#else - TQ_UNUSED( index ) -#endif -} - - -/*! - Returns a new shared array block. -*/ - -TQGArray::array_data * TQGArray::newData() -{ - return new array_data; -} - - -/*! - Deletes the shared array block \a p. -*/ - -void TQGArray::deleteData( array_data *p ) -{ - delete p; -} diff --git a/tqtinterface/qt4/src/tools/tqgarray.h b/tqtinterface/qt4/src/tools/tqgarray.h deleted file mode 100644 index bfe1f86..0000000 --- a/tqtinterface/qt4/src/tools/tqgarray.h +++ /dev/null @@ -1,134 +0,0 @@ -/**************************************************************************** -** -** Definition of TQGArray class -** -** Created : 930906 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQGARRAY_H -#define TQGARRAY_H - -#ifndef TQT_H -#include "tqshared.h" -#endif // TQT_H - - -class TQ_EXPORT TQGArray // generic array -{ -friend class TQBuffer; -public: - // do not use this, even though this is public - // ### make protected or private in TQt 4.0 beta? - struct array_data : public TQShared { // shared array - array_data():data(0),len(0) -#ifdef TQT_TQGARRAY_SPEED_OPTIM - ,maxl(0) -#endif - {} - char *data; // actual array data - uint len; -#ifdef TQT_TQGARRAY_SPEED_OPTIM - uint maxl; -#endif - }; - TQGArray(); - enum Optimization { MemOptim, SpeedOptim }; -protected: - TQGArray( int, int ); // dummy; does not alloc - TQGArray( int size ); // allocate 'size' bytes - TQGArray( const TQGArray &a ); // shallow copy - virtual ~TQGArray(); - - TQGArray &operator=( const TQGArray &a ) { return assign( a ); } - - virtual void detach() { duplicate(*this); } - - // ### TQt 4.0: maybe provide two versions of data(), at(), etc. - char *data() const { return shd->data; } - uint nrefs() const { return shd->count; } - uint size() const { return shd->len; } - bool isEqual( const TQGArray &a ) const; - - bool resize( uint newsize, Optimization optim ); - bool resize( uint newsize ); - - bool fill( const char *d, int len, uint sz ); - - TQGArray &assign( const TQGArray &a ); - TQGArray &assign( const char *d, uint len ); - TQGArray &duplicate( const TQGArray &a ); - TQGArray &duplicate( const char *d, uint len ); - void store( const char *d, uint len ); - - array_data *sharedBlock() const { return shd; } - void setSharedBlock( array_data *p ) { shd=(array_data*)p; } - - TQGArray &setRawData( const char *d, uint len ); - void resetRawData( const char *d, uint len ); - - int find( const char *d, uint index, uint sz ) const; - int contains( const char *d, uint sz ) const; - - void sort( uint sz ); - int bsearch( const char *d, uint sz ) const; - - char *at( uint index ) const; - - bool setExpand( uint index, const char *d, uint sz ); - -protected: - virtual array_data *newData(); - virtual void deleteData( array_data *p ); - -private: - static void msg_index( uint ); - array_data *shd; -}; - - -inline char *TQGArray::at( uint index ) const -{ -#if defined(TQT_CHECK_RANGE) - if ( index >= size() ) { - msg_index( index ); - index = 0; - } -#endif - return &shd->data[index]; -} - - -#endif // TQGARRAY_H diff --git a/tqtinterface/qt4/src/tools/tqgcache.cpp b/tqtinterface/qt4/src/tools/tqgcache.cpp deleted file mode 100644 index 4e16ad7..0000000 --- a/tqtinterface/qt4/src/tools/tqgcache.cpp +++ /dev/null @@ -1,866 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQGCache and TQGCacheIterator classes -** -** Created : 950208 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqgcache.h" -#include "tqptrlist.h" -#include "tqdict.h" -#include "tqstring.h" - -/*! - \class TQGCache tqgcache.h - \reentrant - \ingroup shared - \ingroup collection - \brief The TQGCache class is an internal class for implementing TQCache - template classes. - - \internal - - TQGCache is a strictly internal class that acts as a base class for the - \link collection.html collection classes\endlink TQCache and TQIntCache. -*/ - - -/***************************************************************************** - TQGCacheItem class (internal cache item) - *****************************************************************************/ - -struct TQCacheItem -{ - TQCacheItem( void *k, TQPtrCollection::Item d, int c, short p ) - : priority(p), skipPriority(p), cost(c), key(k), data(d), node(0) {} - short priority; - short skipPriority; - int cost; - void *key; - TQPtrCollection::Item data; - TQLNode *node; -}; - - -/***************************************************************************** - TQCList class (internal list of cache items) - *****************************************************************************/ - -class TQCList : private TQPtrList<TQCacheItem> -{ -friend class TQGCacheIterator; -friend class TQCListIt; -public: - TQCList() {} - ~TQCList(); - - void insert( TQCacheItem * ); // insert according to priority - void insert( int, TQCacheItem * ); - void take( TQCacheItem * ); - void reference( TQCacheItem * ); - - void setAutoDelete( bool del ) { TQPtrCollection::setAutoDelete(del); } - - bool removeFirst() { return TQPtrList<TQCacheItem>::removeFirst(); } - bool removeLast() { return TQPtrList<TQCacheItem>::removeLast(); } - - TQCacheItem *first() { return TQPtrList<TQCacheItem>::first(); } - TQCacheItem *last() { return TQPtrList<TQCacheItem>::last(); } - TQCacheItem *prev() { return TQPtrList<TQCacheItem>::prev(); } - TQCacheItem *next() { return TQPtrList<TQCacheItem>::next(); } - -#if defined(TQT_DEBUG) - int inserts; // variables for statistics - int insertCosts; - int insertMisses; - int finds; - int hits; - int hitCosts; - int dumps; - int dumpCosts; -#endif -}; - - -TQCList::~TQCList() -{ -#if defined(TQT_DEBUG) - TQ_ASSERT( count() == 0 ); -#endif -} - - -void TQCList::insert( TQCacheItem *ci ) -{ - TQCacheItem *item = first(); - while( item && item->skipPriority > ci->priority ) { - item->skipPriority--; - item = next(); - } - if ( item ) - TQPtrList<TQCacheItem>::insert( at(), ci ); - else - append( ci ); -#if defined(TQT_DEBUG) - TQ_ASSERT( ci->node == 0 ); -#endif - ci->node = currentNode(); -} - -inline void TQCList::insert( int i, TQCacheItem *ci ) -{ - TQPtrList<TQCacheItem>::insert( i, ci ); -#if defined(TQT_DEBUG) - TQ_ASSERT( ci->node == 0 ); -#endif - ci->node = currentNode(); -} - - -void TQCList::take( TQCacheItem *ci ) -{ - if ( ci ) { -#if defined(TQT_DEBUG) - TQ_ASSERT( ci->node != 0 ); -#endif - takeNode( ci->node ); - ci->node = 0; - } -} - - -inline void TQCList::reference( TQCacheItem *ci ) -{ -#if defined(TQT_DEBUG) - TQ_ASSERT( ci != 0 && ci->node != 0 ); -#endif - ci->skipPriority = ci->priority; - relinkNode( ci->node ); // relink as first item -} - - -class TQCListIt: public TQPtrListIterator<TQCacheItem> -{ -public: - TQCListIt( const TQCList *p ): TQPtrListIterator<TQCacheItem>( *p ) {} - TQCListIt( const TQCListIt *p ): TQPtrListIterator<TQCacheItem>( *p ) {} -}; - - -/***************************************************************************** - TQCDict class (internal dictionary of cache items) - *****************************************************************************/ - -// -// Since we need to decide if the dictionary should use an int or const -// char * key (the "bool trivial" argument in the constructor below) -// we cannot use the macro/template dict, but inherit directly from TQGDict. -// - -class TQCDict : public TQGDict -{ -public: - TQCDict( uint size, uint kt, bool caseSensitive, bool copyKeys ) - : TQGDict( size, (KeyType)kt, caseSensitive, copyKeys ) {} - ~TQCDict(); - - void clear() { TQGDict::clear(); } - - TQCacheItem *find_string(const TQString &key) const - { return (TQCacheItem*)((TQCDict*)this)->look_string(key, 0, 0); } - TQCacheItem *find_ascii(const char *key) const - { return (TQCacheItem*)((TQCDict*)this)->look_ascii(key, 0, 0); } - TQCacheItem *find_int(long key) const - { return (TQCacheItem*)((TQCDict*)this)->look_int(key, 0, 0); } - - TQCacheItem *take_string(const TQString &key) - { return (TQCacheItem*)TQGDict::take_string(key); } - TQCacheItem *take_ascii(const char *key) - { return (TQCacheItem*)TQGDict::take_ascii(key); } - TQCacheItem *take_int(long key) - { return (TQCacheItem*)TQGDict::take_int(key); } - - bool insert_string( const TQString &key, const TQCacheItem *ci ) - { return TQGDict::look_string(key,(Item)ci,1)!=0;} - bool insert_ascii( const char *key, const TQCacheItem *ci ) - { return TQGDict::look_ascii(key,(Item)ci,1)!=0;} - bool insert_int( long key, const TQCacheItem *ci ) - { return TQGDict::look_int(key,(Item)ci,1)!=0;} - - bool remove_string( TQCacheItem *item ) - { return TQGDict::remove_string(*((TQString*)(item->key)),item); } - bool remove_ascii( TQCacheItem *item ) - { return TQGDict::remove_ascii((const char *)item->key,item); } - bool remove_int( TQCacheItem *item ) - { return TQGDict::remove_int((long)item->key,item);} - - void statistics() { TQGDict::statistics(); } - -private: - void deleteItem( void *item ) - { if ( del_item ) { TQCacheItem *d = (TQCacheItem*)item; delete d; } } -}; - -inline TQCDict::~TQCDict() -{ - clear(); -} - -/***************************************************************************** - TQGDict member functions - *****************************************************************************/ - -/*! - Constructs a cache. - The maximum cost of the cache is given by \a maxCost and the size by \a - size. The key type is \a kt which may be \c StringKey, \c AsciiKey, - \c IntKey or \c PtrKey. The case-sensitivity of lookups is set with - \a caseSensitive. Keys are copied if \a copyKeys is TRUE. -*/ - -TQGCache::TQGCache( int maxCost, uint size, KeyType kt, bool caseSensitive, - bool copyKeys ) -{ - keytype = kt; - lruList = new TQCList; - TQ_CHECK_PTR( lruList ); - lruList->setAutoDelete( TRUE ); - copyk = ((keytype == AsciiKey) && copyKeys); - dict = new TQCDict( size, kt, caseSensitive, FALSE ); - TQ_CHECK_PTR( dict ); - mCost = maxCost; - tCost = 0; -#if defined(TQT_DEBUG) - lruList->inserts = 0; - lruList->insertCosts = 0; - lruList->insertMisses = 0; - lruList->finds = 0; - lruList->hits = 0; - lruList->hitCosts = 0; - lruList->dumps = 0; - lruList->dumpCosts = 0; -#endif -} - -/*! - Cannot copy a cache. -*/ - -TQGCache::TQGCache( const TQGCache & ) - : TQPtrCollection() -{ -#if defined(TQT_CHECK_NULL) - qFatal( "TQGCache::TQGCache(TQGCache &): Cannot copy a cache" ); -#endif -} - -/*! - Removes all items from the cache and destroys it. -*/ - -TQGCache::~TQGCache() -{ - clear(); - delete dict; - delete lruList; -} - -/*! - Cannot assign a cache. -*/ - -TQGCache &TQGCache::operator=( const TQGCache & ) -{ -#if defined(TQT_CHECK_NULL) - qFatal( "TQGCache::operator=: Cannot copy a cache" ); -#endif - return *this; -} - - -/*! - Returns the number of items in the cache. -*/ - -uint TQGCache::count() const -{ - return dict->count(); -} - -/*! - Returns the size of the hash array. -*/ - -uint TQGCache::size() const -{ - return dict->size(); -} - -/*! - \fn int TQGCache::maxCost() const - - Returns the maximum cache cost. -*/ - -/*! - \fn int TQGCache::totalCost() const - - Returns the total cache cost. -*/ - -/*! - Sets the maximum cache cost to \a maxCost. -*/ - -void TQGCache::setMaxCost( int maxCost ) -{ - if ( maxCost < tCost ) { - if ( !makeRoomFor(tCost - maxCost) ) // remove excess cost - return; - } - mCost = maxCost; -} - - -/*! - Inserts an item with data \a data into the cache using key \a key. - The item has cost \a cost and priority \a priority. - - \warning If this function returns FALSE, you must delete \a data - yourself. Additionally, be very careful about using \a data after - calling this function, as any other insertions into the cache, from - anywhere in the application, or within TQt itself, could cause the - data to be discarded from the cache, and the pointer to become - invalid. -*/ - -bool TQGCache::insert_string( const TQString &key, TQPtrCollection::Item data, - int cost, int priority) -{ - if ( tCost + cost > mCost ) { - if ( !makeRoomFor(tCost + cost - mCost, priority) ) { -#if defined(TQT_DEBUG) - lruList->insertMisses++; -#endif - return FALSE; - } - } -#if defined(TQT_DEBUG) - TQ_ASSERT( keytype == StringKey ); - lruList->inserts++; - lruList->insertCosts += cost; -#endif - if ( priority < -32768 ) - priority = -32768; - else if ( priority > 32767 ) - priority = 32677; - TQCacheItem *ci = new TQCacheItem( new TQString(key), newItem(data), - cost, (short)priority ); - TQ_CHECK_PTR( ci ); - lruList->insert( 0, ci ); - dict->insert_string( key, ci ); - tCost += cost; - return TRUE; -} - -bool TQGCache::insert_other( const char *key, TQPtrCollection::Item data, - int cost, int priority) -{ - if ( tCost + cost > mCost ) { - if ( !makeRoomFor(tCost + cost - mCost, priority) ) { -#if defined(TQT_DEBUG) - lruList->insertMisses++; -#endif - return FALSE; - } - } -#if defined(TQT_DEBUG) - TQ_ASSERT( keytype != StringKey ); - lruList->inserts++; - lruList->insertCosts += cost; -#endif - if ( keytype == AsciiKey && copyk ) - key = qstrdup( key ); - if ( priority < -32768 ) - priority = -32768; - else if ( priority > 32767 ) - priority = 32677; - TQCacheItem *ci = new TQCacheItem( (void*)key, newItem(data), cost, - (short)priority ); - TQ_CHECK_PTR( ci ); - lruList->insert( 0, ci ); - if ( keytype == AsciiKey ) - dict->insert_ascii( key, ci ); - else - dict->insert_int( (long)key, ci ); - tCost += cost; - return TRUE; -} - - -/*! - Removes the item with key \a key from the cache. Returns TRUE if the - item was removed; otherwise returns FALSE. -*/ - -bool TQGCache::remove_string( const TQString &key ) -{ - Item d = take_string( key ); - if ( d ) - deleteItem( d ); - return d != 0; -} - -bool TQGCache::remove_other( const char *key ) -{ - Item d = take_other( key ); - if ( d ) - deleteItem( d ); - return d != 0; -} - - -/*! - Takes the item with key \a key out of the cache. The item is not - deleted. If no item has this \a key 0 is returned. -*/ - -TQPtrCollection::Item TQGCache::take_string( const TQString &key ) -{ - TQCacheItem *ci = dict->take_string( key ); // take from dict - Item d; - if ( ci ) { - d = ci->data; - tCost -= ci->cost; - lruList->take( ci ); // take from list - delete (TQString*)ci->key; - delete ci; - } else { - d = 0; - } - return d; -} - -/*! - Takes the item with key \a key out of the cache. The item is not - deleted. If no item has this \a key 0 is returned. -*/ - -TQPtrCollection::Item TQGCache::take_other( const char *key ) -{ - TQCacheItem *ci; - if ( keytype == AsciiKey ) - ci = dict->take_ascii( key ); - else - ci = dict->take_int( (long)key ); - Item d; - if ( ci ) { - d = ci->data; - tCost -= ci->cost; - lruList->take( ci ); // take from list - if ( copyk ) - delete [] (char *)ci->key; - delete ci; - } else { - d = 0; - } - return d; -} - - -/*! - Clears the cache. -*/ - -void TQGCache::clear() -{ - TQCacheItem *ci; - while ( (ci = lruList->first()) ) { - switch ( keytype ) { - case StringKey: - dict->remove_string( ci ); - delete (TQString*)ci->key; - break; - case AsciiKey: - dict->remove_ascii( ci ); - if ( copyk ) - delete [] (char*)ci->key; - break; - case IntKey: - dict->remove_int( ci ); - break; - case PtrKey: // unused - break; - } - deleteItem( ci->data ); // delete data - lruList->removeFirst(); // remove from list - } - tCost = 0; -} - - -/*! - Finds an item for \a key in the cache and adds a reference if \a ref is TRUE. -*/ - -TQPtrCollection::Item TQGCache::find_string( const TQString &key, bool ref ) const -{ - TQCacheItem *ci = dict->find_string( key ); -#if defined(TQT_DEBUG) - lruList->finds++; -#endif - if ( ci ) { -#if defined(TQT_DEBUG) - lruList->hits++; - lruList->hitCosts += ci->cost; -#endif - if ( ref ) - lruList->reference( ci ); - return ci->data; - } - return 0; -} - - -/*! - Finds an item for \a key in the cache and adds a reference if \a ref is TRUE. -*/ - -TQPtrCollection::Item TQGCache::find_other( const char *key, bool ref ) const -{ - TQCacheItem *ci = keytype == AsciiKey ? dict->find_ascii(key) - : dict->find_int((long)key); -#if defined(TQT_DEBUG) - lruList->finds++; -#endif - if ( ci ) { -#if defined(TQT_DEBUG) - lruList->hits++; - lruList->hitCosts += ci->cost; -#endif - if ( ref ) - lruList->reference( ci ); - return ci->data; - } - return 0; -} - - -/*! - Allocates cache space for one or more items. -*/ - -bool TQGCache::makeRoomFor( int cost, int priority ) -{ - if ( cost > mCost ) // cannot make room for more - return FALSE; // than maximum cost - if ( priority == -1 ) - priority = 32767; - register TQCacheItem *ci = lruList->last(); - int cntCost = 0; - int dumps = 0; // number of items to dump - while ( cntCost < cost && ci && ci->skipPriority <= priority ) { - cntCost += ci->cost; - ci = lruList->prev(); - dumps++; - } - if ( cntCost < cost ) // can enough cost be dumped? - return FALSE; // no -#if defined(TQT_DEBUG) - TQ_ASSERT( dumps > 0 ); -#endif - while ( dumps-- ) { - ci = lruList->last(); -#if defined(TQT_DEBUG) - lruList->dumps++; - lruList->dumpCosts += ci->cost; -#endif - switch ( keytype ) { - case StringKey: - dict->remove_string( ci ); - delete (TQString*)ci->key; - break; - case AsciiKey: - dict->remove_ascii( ci ); - if ( copyk ) - delete [] (char *)ci->key; - break; - case IntKey: - dict->remove_int( ci ); - break; - case PtrKey: // unused - break; - } - deleteItem( ci->data ); // delete data - lruList->removeLast(); // remove from list - } - tCost -= cntCost; - return TRUE; -} - - -/*! - Outputs debug statistics. -*/ - -void TQGCache::statistics() const -{ -#if defined(TQT_DEBUG) - TQString line; - line.fill( '*', 80 ); - qDebug( line.ascii() ); - qDebug( "CACHE STATISTICS:" ); - qDebug( "cache contains %d item%s, with a total cost of %d", - count(), count() != 1 ? "s" : "", tCost ); - qDebug( "maximum cost is %d, cache is %d%% full.", - mCost, (200*tCost + mCost) / (mCost*2) ); - qDebug( "find() has been called %d time%s", - lruList->finds, lruList->finds != 1 ? "s" : "" ); - qDebug( "%d of these were hits, items found had a total cost of %d.", - lruList->hits,lruList->hitCosts ); - qDebug( "%d item%s %s been inserted with a total cost of %d.", - lruList->inserts,lruList->inserts != 1 ? "s" : "", - lruList->inserts != 1 ? "have" : "has", lruList->insertCosts ); - qDebug( "%d item%s %s too large or had too low priority to be inserted.", - lruList->insertMisses, lruList->insertMisses != 1 ? "s" : "", - lruList->insertMisses != 1 ? "were" : "was" ); - qDebug( "%d item%s %s been thrown away with a total cost of %d.", - lruList->dumps, lruList->dumps != 1 ? "s" : "", - lruList->dumps != 1 ? "have" : "has", lruList->dumpCosts ); - qDebug( "Statistics from internal dictionary class:" ); - dict->statistics(); - qDebug( line.ascii() ); -#endif -} - - -/***************************************************************************** - TQGCacheIterator member functions - *****************************************************************************/ - -/*! - \class TQGCacheIterator tqgcache.h - \reentrant - \ingroup shared - \ingroup collection - \brief The TQGCacheIterator class is an internal class for implementing TQCacheIterator and - TQIntCacheIterator. - - \internal - - TQGCacheIterator is a strictly internal class that does the heavy work for - TQCacheIterator and TQIntCacheIterator. -*/ - -/*! - Constructs an iterator that operates on the cache \a c. -*/ - -TQGCacheIterator::TQGCacheIterator( const TQGCache &c ) -{ - it = new TQCListIt( c.lruList ); -#if defined(TQT_DEBUG) - TQ_ASSERT( it != 0 ); -#endif -} - -/*! - Constructs an iterator that operates on the same cache as \a ci. -*/ - -TQGCacheIterator::TQGCacheIterator( const TQGCacheIterator &ci ) -{ - it = new TQCListIt( ci.it ); -#if defined(TQT_DEBUG) - TQ_ASSERT( it != 0 ); -#endif -} - -/*! - Destroys the iterator. -*/ - -TQGCacheIterator::~TQGCacheIterator() -{ - delete it; -} - -/*! - Assigns the iterator \a ci to this cache iterator. -*/ - -TQGCacheIterator &TQGCacheIterator::operator=( const TQGCacheIterator &ci ) -{ - *it = *ci.it; - return *this; -} - -/*! - Returns the number of items in the cache. -*/ - -uint TQGCacheIterator::count() const -{ - return it->count(); -} - -/*! - Returns TRUE if the iterator points to the first item. -*/ - -bool TQGCacheIterator::atFirst() const -{ - return it->atFirst(); -} - -/*! - Returns TRUE if the iterator points to the last item. -*/ - -bool TQGCacheIterator::atLast() const -{ - return it->atLast(); -} - -/*! - Sets the list iterator to point to the first item in the cache. -*/ - -TQPtrCollection::Item TQGCacheIterator::toFirst() -{ - TQCacheItem *item = it->toFirst(); - return item ? item->data : 0; -} - -/*! - Sets the list iterator to point to the last item in the cache. -*/ - -TQPtrCollection::Item TQGCacheIterator::toLast() -{ - TQCacheItem *item = it->toLast(); - return item ? item->data : 0; -} - -/*! - Returns the current item. -*/ - -TQPtrCollection::Item TQGCacheIterator::get() const -{ - TQCacheItem *item = it->current(); - return item ? item->data : 0; -} - -/*! - Returns the key of the current item. -*/ - -TQString TQGCacheIterator::getKeyString() const -{ - TQCacheItem *item = it->current(); - return item ? *((TQString*)item->key) : TQString::null; -} - -/*! - Returns the key of the current item, as a \0-terminated C string. -*/ - -const char *TQGCacheIterator::getKeyAscii() const -{ - TQCacheItem *item = it->current(); - return item ? (const char *)item->key : 0; -} - -/*! - Returns the key of the current item, as a long. -*/ - -long TQGCacheIterator::getKeyInt() const -{ - TQCacheItem *item = it->current(); - return item ? (long)item->key : 0; -} - -/*! - Moves to the next item (postfix). -*/ - -TQPtrCollection::Item TQGCacheIterator::operator()() -{ - TQCacheItem *item = it->operator()(); - return item ? item->data : 0; -} - -/*! - Moves to the next item (prefix). -*/ - -TQPtrCollection::Item TQGCacheIterator::operator++() -{ - TQCacheItem *item = it->operator++(); - return item ? item->data : 0; -} - -/*! - Moves \a jump positions forward. -*/ - -TQPtrCollection::Item TQGCacheIterator::operator+=( uint jump ) -{ - TQCacheItem *item = it->operator+=(jump); - return item ? item->data : 0; -} - -/*! - Moves to the previous item (prefix). -*/ - -TQPtrCollection::Item TQGCacheIterator::operator--() -{ - TQCacheItem *item = it->operator--(); - return item ? item->data : 0; -} - -/*! - Moves \a jump positions backward. -*/ - -TQPtrCollection::Item TQGCacheIterator::operator-=( uint jump ) -{ - TQCacheItem *item = it->operator-=(jump); - return item ? item->data : 0; -} diff --git a/tqtinterface/qt4/src/tools/tqgcache.h b/tqtinterface/qt4/src/tools/tqgcache.h deleted file mode 100644 index 27887c3..0000000 --- a/tqtinterface/qt4/src/tools/tqgcache.h +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** -** -** Definition of TQGCache and TQGCacheIterator classes -** -** Created : 950208 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQGCACHE_H -#define TQGCACHE_H - -#ifndef TQT_H -#include "tqptrcollection.h" -#include "tqglist.h" -#include "tqgdict.h" -#endif // TQT_H - - -class TQCList; // internal classes -class TQCListIt; -class TQCDict; - - -class TQ_EXPORT TQGCache : public TQPtrCollection // generic LRU cache -{ -friend class TQGCacheIterator; -protected: - enum KeyType { StringKey, AsciiKey, IntKey, PtrKey }; - // identical to TQGDict's, but PtrKey is not used at the moment - - TQGCache( int maxCost, uint size, KeyType kt, bool caseSensitive, - bool copyKeys ); - TQGCache( const TQGCache & ); // not allowed, calls fatal() - ~TQGCache(); - TQGCache &operator=( const TQGCache & ); // not allowed, calls fatal() - - uint count() const; - uint size() const; - int maxCost() const { return mCost; } - int totalCost() const { return tCost; } - void setMaxCost( int maxCost ); - void clear(); - - bool insert_string( const TQString &key, TQPtrCollection::Item, - int cost, int priority ); - bool insert_other( const char *key, TQPtrCollection::Item, - int cost, int priority ); - bool remove_string( const TQString &key ); - bool remove_other( const char *key ); - TQPtrCollection::Item take_string( const TQString &key ); - TQPtrCollection::Item take_other( const char *key ); - - TQPtrCollection::Item find_string( const TQString &key, bool ref=TRUE ) const; - TQPtrCollection::Item find_other( const char *key, bool ref=TRUE ) const; - - void statistics() const; - -private: - bool makeRoomFor( int cost, int priority = -1 ); - KeyType keytype; - TQCList *lruList; - TQCDict *dict; - int mCost; - int tCost; - bool copyk; -}; - - -class TQ_EXPORT TQGCacheIterator // generic cache iterator -{ -protected: - TQGCacheIterator( const TQGCache & ); - TQGCacheIterator( const TQGCacheIterator & ); - ~TQGCacheIterator(); - TQGCacheIterator &operator=( const TQGCacheIterator & ); - - uint count() const; - bool atFirst() const; - bool atLast() const; - TQPtrCollection::Item toFirst(); - TQPtrCollection::Item toLast(); - - TQPtrCollection::Item get() const; - TQString getKeyString() const; - const char *getKeyAscii() const; - long getKeyInt() const; - - TQPtrCollection::Item operator()(); - TQPtrCollection::Item operator++(); - TQPtrCollection::Item operator+=( uint ); - TQPtrCollection::Item operator--(); - TQPtrCollection::Item operator-=( uint ); - -protected: - TQCListIt *it; // iterator on cache list -}; - - -#endif // TQGCACHE_H diff --git a/tqtinterface/qt4/src/tools/tqgdict.cpp b/tqtinterface/qt4/src/tools/tqgdict.cpp deleted file mode 100644 index dc4d450..0000000 --- a/tqtinterface/qt4/src/tools/tqgdict.cpp +++ /dev/null @@ -1,1151 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQGDict and TQGDictIterator classes -** -** Created : 920529 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqgdict.h" -#include "tqptrlist.h" -#include "tqstring.h" -#include "tqdatastream.h" -#include <ctype.h> - -/*! - \class TQGDict - \reentrant - \ingroup collection - \brief The TQGDict class is an internal class for implementing TQDict template classes. - - \internal - - TQGDict is a strictly internal class that acts as a base class for the - \link collection.html collection classes\endlink TQDict and TQIntDict. - - TQGDict has some virtual functions that can be reimplemented to customize - the subclasses. - \list - \i read() reads a collection/dictionary item from a TQDataStream. - \i write() writes a collection/dictionary item to a TQDataStream. - \endlist - Normally, you do not have to reimplement any of these functions. -*/ - -static const int op_find = 0; -static const int op_insert = 1; -static const int op_replace = 2; - - -class TQGDItList : public TQPtrList<TQGDictIterator> -{ -public: - TQGDItList() : TQPtrList<TQGDictIterator>() {} - TQGDItList( const TQGDItList &list ) : TQPtrList<TQGDictIterator>(list) {} - ~TQGDItList() { clear(); } - TQGDItList &operator=(const TQGDItList &list) - { return (TQGDItList&)TQPtrList<TQGDictIterator>::operator=(list); } -}; - - -/***************************************************************************** - Default implementation of special and virtual functions - *****************************************************************************/ - -/*! - Returns the hash key for \a key, when key is a string. -*/ - -int TQGDict::hashKeyString( const TQString &key ) -{ -#if defined(TQT_CHECK_NULL) - if ( key.isNull() ) - qWarning( "TQGDict::hashKeyString: Invalid null key" ); -#endif - int i; - register uint h=0; - uint g; - const TQChar *p = key.tqunicode(); - if ( cases ) { // case sensitive - for ( i=0; i<(int)key.length(); i++ ) { - h = (h<<4) + p[i].cell(); - if ( (g = h & 0xf0000000) ) - h ^= g >> 24; - h &= ~g; - } - } else { // case insensitive - for ( i=0; i<(int)key.length(); i++ ) { - h = (h<<4) + p[i].lower().cell(); - if ( (g = h & 0xf0000000) ) - h ^= g >> 24; - h &= ~g; - } - } - int index = h; - if ( index < 0 ) // adjust index to table size - index = -index; - return index; -} - -/*! - Returns the hash key for \a key, which is a C string. -*/ - -int TQGDict::hashKeyAscii( const char *key ) -{ -#if defined(TQT_CHECK_NULL) - if ( key == 0 ) - qWarning( "TQGDict::hashAsciiKey: Invalid null key" ); -#endif - register const char *k = key; - register uint h=0; - uint g; - if ( cases ) { // case sensitive - while ( *k ) { - h = (h<<4) + *k++; - if ( (g = h & 0xf0000000) ) - h ^= g >> 24; - h &= ~g; - } - } else { // case insensitive - while ( *k ) { - h = (h<<4) + tolower((uchar) *k); - if ( (g = h & 0xf0000000) ) - h ^= g >> 24; - h &= ~g; - k++; - } - } - int index = h; - if ( index < 0 ) // adjust index to table size - index = -index; - return index; -} - -#ifndef TQT_NO_DATASTREAM - -/*! - \overload - Reads a collection/dictionary item from the stream \a s and returns a - reference to the stream. - - The default implementation sets \a item to 0. - - \sa write() -*/ - -TQDataStream& TQGDict::read( TQDataStream &s, TQPtrCollection::Item &item ) -{ - item = 0; - return s; -} - -/*! - \overload - Writes a collection/dictionary item to the stream \a s and returns a - reference to the stream. - - \sa read() -*/ - -TQDataStream& TQGDict::write( TQDataStream &s, TQPtrCollection::Item ) const -{ - return s; -} -#endif //TQT_NO_DATASTREAM - -/***************************************************************************** - TQGDict member functions - *****************************************************************************/ - -/*! - Constructs a dictionary. - - \a len is the initial size of the dictionary. - The key type is \a kt which may be \c StringKey, \c AsciiKey, - \c IntKey or \c PtrKey. The case-sensitivity of lookups is set with - \a caseSensitive. Keys are copied if \a copyKeys is TRUE. -*/ - -TQGDict::TQGDict( uint len, KeyType kt, bool caseSensitive, bool copyKeys ) -{ - init( len, kt, caseSensitive, copyKeys ); -} - - -void TQGDict::init( uint len, KeyType kt, bool caseSensitive, bool copyKeys ) -{ - vlen = len ? len : 17; - vec = new TQBaseBucket *[ vlen ]; - - TQ_CHECK_PTR( vec ); - memset( (char*)vec, 0, vlen*sizeof(TQBaseBucket*) ); - numItems = 0; - iterators = 0; - // The caseSensitive and copyKey options don't make sense for - // all dict types. - switch ( (keytype = (uint)kt) ) { - case StringKey: - cases = caseSensitive; - copyk = FALSE; - break; - case AsciiKey: - cases = caseSensitive; - copyk = copyKeys; - break; - default: - cases = FALSE; - copyk = FALSE; - break; - } -} - - -/*! - Constructs a copy of \a dict. -*/ - -TQGDict::TQGDict( const TQGDict & dict ) - : TQPtrCollection( dict ) -{ - init( dict.vlen, (KeyType)dict.keytype, dict.cases, dict.copyk ); - TQGDictIterator it( dict ); - while ( it.get() ) { // copy from other dict - switch ( keytype ) { - case StringKey: - look_string( it.getKeyString(), it.get(), op_insert ); - break; - case AsciiKey: - look_ascii( it.getKeyAscii(), it.get(), op_insert ); - break; - case IntKey: - look_int( it.getKeyInt(), it.get(), op_insert ); - break; - case PtrKey: - look_ptr( it.getKeyPtr(), it.get(), op_insert ); - break; - } - ++it; - } -} - - -/*! - Removes all items from the dictionary and destroys it. -*/ - -TQGDict::~TQGDict() -{ - clear(); // delete everything - delete [] vec; - if ( !iterators ) // no iterators for this dict - return; - TQGDictIterator *i = iterators->first(); - while ( i ) { // notify all iterators that - i->dict = 0; // this dict is deleted - i = iterators->next(); - } - delete iterators; -} - - -/*! - Assigns \a dict to this dictionary. -*/ - -TQGDict &TQGDict::operator=( const TQGDict &dict ) -{ - if ( &dict == this ) - return *this; - clear(); - TQGDictIterator it( dict ); - while ( it.get() ) { // copy from other dict - switch ( keytype ) { - case StringKey: - look_string( it.getKeyString(), it.get(), op_insert ); - break; - case AsciiKey: - look_ascii( it.getKeyAscii(), it.get(), op_insert ); - break; - case IntKey: - look_int( it.getKeyInt(), it.get(), op_insert ); - break; - case PtrKey: - look_ptr( it.getKeyPtr(), it.get(), op_insert ); - break; - } - ++it; - } - return *this; -} - -/*! - \fn uint TQGDict::count() const - - Returns the number of items in the dictionary. -*/ - -/*! - \fn uint TQGDict::size() const - - Returns the size of the hash array. -*/ - -/*! - The do-it-all function; \a op is one of op_find, op_insert, op_replace. - The key is \a key and the item is \a d. -*/ - -TQPtrCollection::Item TQGDict::look_string( const TQString &key, TQPtrCollection::Item d, - int op ) -{ - TQStringBucket *n = 0; - int index = hashKeyString(key) % vlen; - if ( op == op_find ) { // find - if ( cases ) { - n = (TQStringBucket*)vec[index]; - while( n != 0 ) { - if ( key == n->getKey() ) - return n->getData(); // item found - n = (TQStringBucket*)n->getNext(); - } - } else { - TQString k = key.lower(); - n = (TQStringBucket*)vec[index]; - while( n != 0 ) { - if ( k == n->getKey().lower() ) - return n->getData(); // item found - n = (TQStringBucket*)n->getNext(); - } - } - return 0; // not found - } - if ( op == op_replace ) { // replace - if ( vec[index] != 0 ) // maybe something there - remove_string( key ); - } - // op_insert or op_replace - n = new TQStringBucket(key,newItem(d),vec[index]); - TQ_CHECK_PTR( n ); -#if defined(TQT_CHECK_NULL) - if ( n->getData() == 0 ) - qWarning( "TQDict: Cannot insert null item" ); -#endif - vec[index] = n; - numItems++; - return n->getData(); -} - -TQPtrCollection::Item TQGDict::look_ascii( const char *key, TQPtrCollection::Item d, int op ) -{ - TQAsciiBucket *n; - int index = hashKeyAscii(key) % vlen; - if ( op == op_find ) { // find - if ( cases ) { - for ( n=(TQAsciiBucket*)vec[index]; n; - n=(TQAsciiBucket*)n->getNext() ) { - if ( qstrcmp(n->getKey(),key) == 0 ) - return n->getData(); // item found - } - } else { - for ( n=(TQAsciiBucket*)vec[index]; n; - n=(TQAsciiBucket*)n->getNext() ) { - if ( qstricmp(n->getKey(),key) == 0 ) - return n->getData(); // item found - } - } - return 0; // not found - } - if ( op == op_replace ) { // replace - if ( vec[index] != 0 ) // maybe something there - remove_ascii( key ); - } - // op_insert or op_replace - n = new TQAsciiBucket(copyk ? qstrdup(key) : key,newItem(d),vec[index]); - TQ_CHECK_PTR( n ); -#if defined(TQT_CHECK_NULL) - if ( n->getData() == 0 ) - qWarning( "TQAsciiDict: Cannot insert null item" ); -#endif - vec[index] = n; - numItems++; - return n->getData(); -} - -TQPtrCollection::Item TQGDict::look_int( long key, TQPtrCollection::Item d, int op ) -{ - TQIntBucket *n; - int index = (int)((ulong)key % vlen); // simple hash - if ( op == op_find ) { // find - for ( n=(TQIntBucket*)vec[index]; n; - n=(TQIntBucket*)n->getNext() ) { - if ( n->getKey() == key ) - return n->getData(); // item found - } - return 0; // not found - } - if ( op == op_replace ) { // replace - if ( vec[index] != 0 ) // maybe something there - remove_int( key ); - } - // op_insert or op_replace - n = new TQIntBucket(key,newItem(d),vec[index]); - TQ_CHECK_PTR( n ); -#if defined(TQT_CHECK_NULL) - if ( n->getData() == 0 ) - qWarning( "TQIntDict: Cannot insert null item" ); -#endif - vec[index] = n; - numItems++; - return n->getData(); -} - -TQPtrCollection::Item TQGDict::look_ptr( void *key, TQPtrCollection::Item d, int op ) -{ - TQPtrBucket *n; - int index = (int)((ulong)key % vlen); // simple hash - if ( op == op_find ) { // find - for ( n=(TQPtrBucket*)vec[index]; n; - n=(TQPtrBucket*)n->getNext() ) { - if ( n->getKey() == key ) - return n->getData(); // item found - } - return 0; // not found - } - if ( op == op_replace ) { // replace - if ( vec[index] != 0 ) // maybe something there - remove_ptr( key ); - } - // op_insert or op_replace - n = new TQPtrBucket(key,newItem(d),vec[index]); - TQ_CHECK_PTR( n ); -#if defined(TQT_CHECK_NULL) - if ( n->getData() == 0 ) - qWarning( "TQPtrDict: Cannot insert null item" ); -#endif - vec[index] = n; - numItems++; - return n->getData(); -} - - -/*! - Changes the size of the hashtable to \a newsize. - The contents of the dictionary are preserved, - but all iterators on the dictionary become invalid. -*/ -void TQGDict::resize( uint newsize ) -{ - // Save old information - TQBaseBucket **old_vec = vec; - uint old_vlen = vlen; - bool old_copyk = copyk; - - vec = new TQBaseBucket *[vlen = newsize]; - TQ_CHECK_PTR( vec ); - memset( (char*)vec, 0, vlen*sizeof(TQBaseBucket*) ); - numItems = 0; - copyk = FALSE; - - // Reinsert every item from vec, deleting vec as we go - for ( uint index = 0; index < old_vlen; index++ ) { - switch ( keytype ) { - case StringKey: - { - TQStringBucket *n=(TQStringBucket *)old_vec[index]; - while ( n ) { - look_string( n->getKey(), n->getData(), op_insert ); - TQStringBucket *t=(TQStringBucket *)n->getNext(); - delete n; - n = t; - } - } - break; - case AsciiKey: - { - TQAsciiBucket *n=(TQAsciiBucket *)old_vec[index]; - while ( n ) { - look_ascii( n->getKey(), n->getData(), op_insert ); - TQAsciiBucket *t=(TQAsciiBucket *)n->getNext(); - delete n; - n = t; - } - } - break; - case IntKey: - { - TQIntBucket *n=(TQIntBucket *)old_vec[index]; - while ( n ) { - look_int( n->getKey(), n->getData(), op_insert ); - TQIntBucket *t=(TQIntBucket *)n->getNext(); - delete n; - n = t; - } - } - break; - case PtrKey: - { - TQPtrBucket *n=(TQPtrBucket *)old_vec[index]; - while ( n ) { - look_ptr( n->getKey(), n->getData(), op_insert ); - TQPtrBucket *t=(TQPtrBucket *)n->getNext(); - delete n; - n = t; - } - } - break; - } - } - delete [] old_vec; - - // Restore state - copyk = old_copyk; - - // Invalidate all iterators, since order is lost - if ( iterators && iterators->count() ) { - TQGDictIterator *i = iterators->first(); - while ( i ) { - i->toFirst(); - i = iterators->next(); - } - } -} - -/*! - Unlinks the bucket with the specified key (and specified data pointer, - if it is set). -*/ - -void TQGDict::unlink_common( int index, TQBaseBucket *node, TQBaseBucket *prev ) -{ - if ( iterators && iterators->count() ) { // update iterators - TQGDictIterator *i = iterators->first(); - while ( i ) { // tqinvalidate all iterators - if ( i->curNode == node ) // referring to pending node - i->operator++(); - i = iterators->next(); - } - } - if ( prev ) // unlink node - prev->setNext( node->getNext() ); - else - vec[index] = node->getNext(); - numItems--; -} - -TQStringBucket *TQGDict::unlink_string( const TQString &key, TQPtrCollection::Item d ) -{ - if ( numItems == 0 ) // nothing in dictionary - return 0; - TQStringBucket *n; - TQStringBucket *prev = 0; - int index = hashKeyString(key) % vlen; - if ( cases ) { - for ( n=(TQStringBucket*)vec[index]; n; - n=(TQStringBucket*)n->getNext() ) { - bool found = (key == n->getKey()); - if ( found && d ) - found = (n->getData() == d); - if ( found ) { - unlink_common(index,n,prev); - return n; - } - prev = n; - } - } else { - TQString k = key.lower(); - for ( n=(TQStringBucket*)vec[index]; n; - n=(TQStringBucket*)n->getNext() ) { - bool found = (k == n->getKey().lower()); - if ( found && d ) - found = (n->getData() == d); - if ( found ) { - unlink_common(index,n,prev); - return n; - } - prev = n; - } - } - return 0; -} - -TQAsciiBucket *TQGDict::unlink_ascii( const char *key, TQPtrCollection::Item d ) -{ - if ( numItems == 0 ) // nothing in dictionary - return 0; - TQAsciiBucket *n; - TQAsciiBucket *prev = 0; - int index = hashKeyAscii(key) % vlen; - for ( n=(TQAsciiBucket *)vec[index]; n; n=(TQAsciiBucket *)n->getNext() ) { - bool found = (cases ? qstrcmp(n->getKey(),key) - : qstricmp(n->getKey(),key)) == 0; - if ( found && d ) - found = (n->getData() == d); - if ( found ) { - unlink_common(index,n,prev); - return n; - } - prev = n; - } - return 0; -} - -TQIntBucket *TQGDict::unlink_int( long key, TQPtrCollection::Item d ) -{ - if ( numItems == 0 ) // nothing in dictionary - return 0; - TQIntBucket *n; - TQIntBucket *prev = 0; - int index = (int)((ulong)key % vlen); - for ( n=(TQIntBucket *)vec[index]; n; n=(TQIntBucket *)n->getNext() ) { - bool found = (n->getKey() == key); - if ( found && d ) - found = (n->getData() == d); - if ( found ) { - unlink_common(index,n,prev); - return n; - } - prev = n; - } - return 0; -} - -TQPtrBucket *TQGDict::unlink_ptr( void *key, TQPtrCollection::Item d ) -{ - if ( numItems == 0 ) // nothing in dictionary - return 0; - TQPtrBucket *n; - TQPtrBucket *prev = 0; - int index = (int)((ulong)key % vlen); - for ( n=(TQPtrBucket *)vec[index]; n; n=(TQPtrBucket *)n->getNext() ) { - bool found = (n->getKey() == key); - if ( found && d ) - found = (n->getData() == d); - if ( found ) { - unlink_common(index,n,prev); - return n; - } - prev = n; - } - return 0; -} - - -/*! - Removes the item with the specified \a key. If \a item is not null, - the remove will match the \a item as well (used to remove an - item when several items have the same key). -*/ - -bool TQGDict::remove_string( const TQString &key, TQPtrCollection::Item item ) -{ - TQStringBucket *n = unlink_string( key, item ); - if ( n ) { - deleteItem( n->getData() ); - delete n; - return TRUE; - } else { - return FALSE; - } -} - -bool TQGDict::remove_ascii( const char *key, TQPtrCollection::Item item ) -{ - TQAsciiBucket *n = unlink_ascii( key, item ); - if ( n ) { - if ( copyk ) - delete [] (char *)n->getKey(); - deleteItem( n->getData() ); - delete n; - } - return n != 0; -} - -bool TQGDict::remove_int( long key, TQPtrCollection::Item item ) -{ - TQIntBucket *n = unlink_int( key, item ); - if ( n ) { - deleteItem( n->getData() ); - delete n; - } - return n != 0; -} - -bool TQGDict::remove_ptr( void *key, TQPtrCollection::Item item ) -{ - TQPtrBucket *n = unlink_ptr( key, item ); - if ( n ) { - deleteItem( n->getData() ); - delete n; - } - return n != 0; -} - -TQPtrCollection::Item TQGDict::take_string( const TQString &key ) -{ - TQStringBucket *n = unlink_string( key ); - Item d; - if ( n ) { - d = n->getData(); - delete n; - } else { - d = 0; - } - return d; -} - -TQPtrCollection::Item TQGDict::take_ascii( const char *key ) -{ - TQAsciiBucket *n = unlink_ascii( key ); - Item d; - if ( n ) { - if ( copyk ) - delete [] (char *)n->getKey(); - d = n->getData(); - delete n; - } else { - d = 0; - } - return d; -} - -TQPtrCollection::Item TQGDict::take_int( long key ) -{ - TQIntBucket *n = unlink_int( key ); - Item d; - if ( n ) { - d = n->getData(); - delete n; - } else { - d = 0; - } - return d; -} - -TQPtrCollection::Item TQGDict::take_ptr( void *key ) -{ - TQPtrBucket *n = unlink_ptr( key ); - Item d; - if ( n ) { - d = n->getData(); - delete n; - } else { - d = 0; - } - return d; -} - -/*! - Removes all items from the dictionary. -*/ -void TQGDict::clear() -{ - if ( !numItems ) - return; - numItems = 0; // disable remove() function - for ( uint j=0; j<vlen; j++ ) { // destroy hash table - if ( vec[j] ) { - switch ( keytype ) { - case StringKey: - { - TQStringBucket *n=(TQStringBucket *)vec[j]; - while ( n ) { - TQStringBucket *next = (TQStringBucket*)n->getNext(); - deleteItem( n->getData() ); - delete n; - n = next; - } - } - break; - case AsciiKey: - { - TQAsciiBucket *n=(TQAsciiBucket *)vec[j]; - while ( n ) { - TQAsciiBucket *next = (TQAsciiBucket*)n->getNext(); - if ( copyk ) - delete [] (char *)n->getKey(); - deleteItem( n->getData() ); - delete n; - n = next; - } - } - break; - case IntKey: - { - TQIntBucket *n=(TQIntBucket *)vec[j]; - while ( n ) { - TQIntBucket *next = (TQIntBucket*)n->getNext(); - deleteItem( n->getData() ); - delete n; - n = next; - } - } - break; - case PtrKey: - { - TQPtrBucket *n=(TQPtrBucket *)vec[j]; - while ( n ) { - TQPtrBucket *next = (TQPtrBucket*)n->getNext(); - deleteItem( n->getData() ); - delete n; - n = next; - } - } - break; - } - vec[j] = 0; // detach list of buckets - } - } - if ( iterators && iterators->count() ) { // tqinvalidate all iterators - TQGDictIterator *i = iterators->first(); - while ( i ) { - i->curNode = 0; - i = iterators->next(); - } - } -} - -/*! - Outputs debug statistics. -*/ -void TQGDict::statistics() const -{ -#if defined(TQT_DEBUG) - TQString line; - line.fill( '-', 60 ); - double real, ideal; - qDebug( line.ascii() ); - qDebug( "DICTIONARY STATISTICS:" ); - if ( count() == 0 ) { - qDebug( "Empty!" ); - qDebug( line.ascii() ); - return; - } - real = 0.0; - ideal = (float)count()/(2.0*size())*(count()+2.0*size()-1); - uint i = 0; - while ( i<size() ) { - TQBaseBucket *n = vec[i]; - int b = 0; - while ( n ) { // count number of buckets - b++; - n = n->getNext(); - } - real = real + (double)b * ((double)b+1.0)/2.0; - char buf[80], *pbuf; - if ( b > 78 ) - b = 78; - pbuf = buf; - while ( b-- ) - *pbuf++ = '*'; - *pbuf = '\0'; - qDebug( buf ); - i++; - } - qDebug( "Array size = %d", size() ); - qDebug( "# items = %d", count() ); - qDebug( "Real dist = %g", real ); - qDebug( "Rand dist = %g", ideal ); - qDebug( "Real/Rand = %g", real/ideal ); - qDebug( line.ascii() ); -#endif // TQT_DEBUG -} - - -/***************************************************************************** - TQGDict stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -TQDataStream &operator>>( TQDataStream &s, TQGDict &dict ) -{ - return dict.read( s ); -} - -TQDataStream &operator<<( TQDataStream &s, const TQGDict &dict ) -{ - return dict.write( s ); -} - -#if defined(TQ_CC_DEC) && defined(__alpha) && (__DECCXX_VER-0 >= 50190001) -#pragma message disable narrowptr -#endif - -/*! - Reads a dictionary from the stream \a s. -*/ - -TQDataStream &TQGDict::read( TQDataStream &s ) -{ - uint num; - s >> num; // read number of items - clear(); // clear dict - while ( num-- ) { // read all items - Item d; - switch ( keytype ) { - case StringKey: - { - TQString k; - s >> k; - read( s, d ); - look_string( k, d, op_insert ); - } - break; - case AsciiKey: - { - char *k; - s >> k; - read( s, d ); - look_ascii( k, d, op_insert ); - if ( copyk ) - delete [] k; - } - break; - case IntKey: - { - TQ_UINT32 k; - s >> k; - read( s, d ); - look_int( k, d, op_insert ); - } - break; - case PtrKey: - { - TQ_UINT32 k; - s >> k; - read( s, d ); - // ### cannot insert 0 - this renders the thing - // useless since all pointers are written as 0, - // but hey, serializing pointers? can it be done - // at all, ever? - if ( k ) - look_ptr( (void *)k, d, op_insert ); - } - break; - } - } - return s; -} - -/*! - Writes the dictionary to the stream \a s. -*/ - -TQDataStream& TQGDict::write( TQDataStream &s ) const -{ - s << count(); // write number of items - uint i = 0; - while ( i<size() ) { - TQBaseBucket *n = vec[i]; - while ( n ) { // write all buckets - switch ( keytype ) { - case StringKey: - s << ((TQStringBucket*)n)->getKey(); - break; - case AsciiKey: - s << ((TQAsciiBucket*)n)->getKey(); - break; - case IntKey: - s << (TQ_UINT32)((TQIntBucket*)n)->getKey(); - break; - case PtrKey: - s << (TQ_UINT32)0; // ### cannot serialize a pointer - break; - } - write( s, n->getData() ); // write data - n = n->getNext(); - } - i++; - } - return s; -} -#endif //TQT_NO_DATASTREAM - -/***************************************************************************** - TQGDictIterator member functions - *****************************************************************************/ - -/*! - \class TQGDictIterator tqgdict.h - \reentrant - \ingroup collection - \brief The TQGDictIterator class is an internal class for implementing TQDictIterator and TQIntDictIterator. - - \internal - - TQGDictIterator is a strictly internal class that does the heavy work for - TQDictIterator and TQIntDictIterator. -*/ - -/*! - Constructs an iterator that operates on the dictionary \a d. -*/ - -TQGDictIterator::TQGDictIterator( const TQGDict &d ) -{ - dict = (TQGDict *)&d; // get reference to dict - toFirst(); // set to first noe - if ( !dict->iterators ) { - dict->iterators = new TQGDItList; // create iterator list - TQ_CHECK_PTR( dict->iterators ); - } - dict->iterators->append( this ); // attach iterator to dict -} - -/*! - Constructs a copy of the iterator \a it. -*/ - -TQGDictIterator::TQGDictIterator( const TQGDictIterator &it ) -{ - dict = it.dict; - curNode = it.curNode; - curIndex = it.curIndex; - if ( dict ) - dict->iterators->append( this ); // attach iterator to dict -} - -/*! - Assigns a copy of the iterator \a it and returns a reference to this - iterator. -*/ - -TQGDictIterator &TQGDictIterator::operator=( const TQGDictIterator &it ) -{ - if ( dict ) // detach from old dict - dict->iterators->removeRef( this ); - dict = it.dict; - curNode = it.curNode; - curIndex = it.curIndex; - if ( dict ) - dict->iterators->append( this ); // attach to new list - return *this; -} - -/*! - Destroys the iterator. -*/ - -TQGDictIterator::~TQGDictIterator() -{ - if ( dict ) // detach iterator from dict - dict->iterators->removeRef( this ); -} - - -/*! - Sets the iterator to point to the first item in the dictionary. -*/ - -TQPtrCollection::Item TQGDictIterator::toFirst() -{ - if ( !dict ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQGDictIterator::toFirst: Dictionary has been deleted" ); -#endif - return 0; - } - if ( dict->count() == 0 ) { // empty dictionary - curNode = 0; - return 0; - } - register uint i = 0; - register TQBaseBucket **v = dict->vec; - while ( !(*v++) ) - i++; - curNode = dict->vec[i]; - curIndex = i; - return curNode->getData(); -} - - -/*! - Moves to the next item (postfix). -*/ - -TQPtrCollection::Item TQGDictIterator::operator()() -{ - if ( !dict ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQGDictIterator::operator(): Dictionary has been deleted" ); -#endif - return 0; - } - if ( !curNode ) - return 0; - TQPtrCollection::Item d = curNode->getData(); - this->operator++(); - return d; -} - -/*! - Moves to the next item (prefix). -*/ - -TQPtrCollection::Item TQGDictIterator::operator++() -{ - if ( !dict ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQGDictIterator::operator++: Dictionary has been deleted" ); -#endif - return 0; - } - if ( !curNode ) - return 0; - curNode = curNode->getNext(); - if ( !curNode ) { // no next bucket - register uint i = curIndex + 1; // look from next vec element - register TQBaseBucket **v = &dict->vec[i]; - while ( i < dict->size() && !(*v++) ) - i++; - if ( i == dict->size() ) { // nothing found - curNode = 0; - return 0; - } - curNode = dict->vec[i]; - curIndex = i; - } - return curNode->getData(); -} - -/*! - Moves \a jumps positions forward. -*/ - -TQPtrCollection::Item TQGDictIterator::operator+=( uint jumps ) -{ - while ( curNode && jumps-- ) - operator++(); - return curNode ? curNode->getData() : 0; -} diff --git a/tqtinterface/qt4/src/tools/tqgdict.h b/tqtinterface/qt4/src/tools/tqgdict.h deleted file mode 100644 index d9bd543..0000000 --- a/tqtinterface/qt4/src/tools/tqgdict.h +++ /dev/null @@ -1,225 +0,0 @@ -/**************************************************************************** -** -** Definition of TQGDict and TQGDictIterator classes -** -** Created : 920529 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQGDICT_H -#define TQGDICT_H - -#ifndef TQT_H -#include "tqptrcollection.h" -#include "tqstring.h" -#endif // TQT_H - -class TQGDictIterator; -class TQGDItList; - - -class TQBaseBucket // internal dict node -{ -public: - TQPtrCollection::Item getData() { return data; } - TQPtrCollection::Item setData( TQPtrCollection::Item d ) { return data = d; } - TQBaseBucket *getNext() { return next; } - void setNext( TQBaseBucket *n) { next = n; } -protected: - TQBaseBucket( TQPtrCollection::Item d, TQBaseBucket *n ) : data(d), next(n) {} - TQPtrCollection::Item data; - TQBaseBucket *next; -}; - -class TQStringBucket : public TQBaseBucket -{ -public: - TQStringBucket( const TQString &k, TQPtrCollection::Item d, TQBaseBucket *n ) - : TQBaseBucket(d,n), key(k) {} - const TQString &getKey() const { return key; } -private: - TQString key; -}; - -class TQAsciiBucket : public TQBaseBucket -{ -public: - TQAsciiBucket( const char *k, TQPtrCollection::Item d, TQBaseBucket *n ) - : TQBaseBucket(d,n), key(k) {} - const char *getKey() const { return key; } -private: - const char *key; -}; - -class TQIntBucket : public TQBaseBucket -{ -public: - TQIntBucket( long k, TQPtrCollection::Item d, TQBaseBucket *n ) - : TQBaseBucket(d,n), key(k) {} - long getKey() const { return key; } -private: - long key; -}; - -class TQPtrBucket : public TQBaseBucket -{ -public: - TQPtrBucket( void *k, TQPtrCollection::Item d, TQBaseBucket *n ) - : TQBaseBucket(d,n), key(k) {} - void *getKey() const { return key; } -private: - void *key; -}; - - -class TQ_EXPORT TQGDict : public TQPtrCollection // generic dictionary class -{ -public: - uint count() const { return numItems; } - uint size() const { return vlen; } - TQPtrCollection::Item look_string( const TQString& key, TQPtrCollection::Item, - int ); - TQPtrCollection::Item look_ascii( const char *key, TQPtrCollection::Item, int ); - TQPtrCollection::Item look_int( long key, TQPtrCollection::Item, int ); - TQPtrCollection::Item look_ptr( void *key, TQPtrCollection::Item, int ); -#ifndef TQT_NO_DATASTREAM - TQDataStream &read( TQDataStream & ); - TQDataStream &write( TQDataStream & ) const; -#endif -protected: - enum KeyType { StringKey, AsciiKey, IntKey, PtrKey }; - - TQGDict( uint len, KeyType kt, bool cs, bool ck ); - TQGDict( const TQGDict & ); - ~TQGDict(); - - TQGDict &operator=( const TQGDict & ); - - bool remove_string( const TQString &key, TQPtrCollection::Item item=0 ); - bool remove_ascii( const char *key, TQPtrCollection::Item item=0 ); - bool remove_int( long key, TQPtrCollection::Item item=0 ); - bool remove_ptr( void *key, TQPtrCollection::Item item=0 ); - TQPtrCollection::Item take_string( const TQString &key ); - TQPtrCollection::Item take_ascii( const char *key ); - TQPtrCollection::Item take_int( long key ); - TQPtrCollection::Item take_ptr( void *key ); - - void clear(); - void resize( uint ); - - int hashKeyString( const TQString & ); - int hashKeyAscii( const char * ); - - void statistics() const; - -#ifndef TQT_NO_DATASTREAM - virtual TQDataStream &read( TQDataStream &, TQPtrCollection::Item & ); - virtual TQDataStream &write( TQDataStream &, TQPtrCollection::Item ) const; -#endif -private: - TQBaseBucket **vec; - uint vlen; - uint numItems; - uint keytype : 2; - uint cases : 1; - uint copyk : 1; - TQGDItList *iterators; - void unlink_common( int, TQBaseBucket *, TQBaseBucket * ); - TQStringBucket *unlink_string( const TQString &, - TQPtrCollection::Item item = 0 ); - TQAsciiBucket *unlink_ascii( const char *, TQPtrCollection::Item item = 0 ); - TQIntBucket *unlink_int( long, TQPtrCollection::Item item = 0 ); - TQPtrBucket *unlink_ptr( void *, TQPtrCollection::Item item = 0 ); - void init( uint, KeyType, bool, bool ); - friend class TQGDictIterator; -}; - - -class TQ_EXPORT TQGDictIterator // generic dictionary iterator -{ -friend class TQGDict; -public: - TQGDictIterator( const TQGDict & ); - TQGDictIterator( const TQGDictIterator & ); - TQGDictIterator &operator=( const TQGDictIterator & ); - ~TQGDictIterator(); - - TQPtrCollection::Item toFirst(); - - TQPtrCollection::Item get() const; - TQString getKeyString() const; - const char *getKeyAscii() const; - long getKeyInt() const; - void *getKeyPtr() const; - - TQPtrCollection::Item operator()(); - TQPtrCollection::Item operator++(); - TQPtrCollection::Item operator+=(uint); - -protected: - TQGDict *dict; - -private: - TQBaseBucket *curNode; - uint curIndex; -}; - -inline TQPtrCollection::Item TQGDictIterator::get() const -{ - return curNode ? curNode->getData() : 0; -} - -inline TQString TQGDictIterator::getKeyString() const -{ - return curNode ? ((TQStringBucket*)curNode)->getKey() : TQString::null; -} - -inline const char *TQGDictIterator::getKeyAscii() const -{ - return curNode ? ((TQAsciiBucket*)curNode)->getKey() : 0; -} - -inline long TQGDictIterator::getKeyInt() const -{ - return curNode ? ((TQIntBucket*)curNode)->getKey() : 0; -} - -inline void *TQGDictIterator::getKeyPtr() const -{ - return curNode ? ((TQPtrBucket*)curNode)->getKey() : 0; -} - - -#endif // TQGDICT_H diff --git a/tqtinterface/qt4/src/tools/tqgeneric.h b/tqtinterface/qt4/src/tools/tqgeneric.h deleted file mode 100644 index 9ab0d6f..0000000 --- a/tqtinterface/qt4/src/tools/tqgeneric.h +++ /dev/null @@ -1,46 +0,0 @@ -/**************************************************************************** -** -** Macros for pasting tokens; utilized by our generic classes -** -** Created : 920529 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQGENERIC_H -#define TQGENERIC_H - -#error "do not include tqgeneric.h any more" - -#endif // TQGENERIC_H diff --git a/tqtinterface/qt4/src/tools/tqglist.cpp b/tqtinterface/qt4/src/tools/tqglist.cpp deleted file mode 100644 index 07851ba..0000000 --- a/tqtinterface/qt4/src/tools/tqglist.cpp +++ /dev/null @@ -1,1267 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQGList and TQGListIterator classes -** -** Created : 920624 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqglist.h" -#include "tqgvector.h" -#include "tqdatastream.h" -#include "tqvaluelist.h" - -/*! - \class TQLNode tqglist.h - \reentrant - \ingroup collection - \brief The TQLNode class is an internal class for the TQPtrList template collection. - - \internal - - TQLNode is a doubly-linked list node. It has three pointers: - \list 1 - \i Pointer to the previous node. - \i Pointer to the next node. - \i Pointer to the actual data. - \endlist - - It might sometimes be practical to have direct access to the list nodes - in a TQPtrList, but it is seldom required. - - Be very careful if you want to access the list nodes. The heap can - easily get corrupted if you make a mistake. - - \sa TQPtrList::currentNode(), TQPtrList::removeNode(), TQPtrList::takeNode() -*/ - -/*! - \fn TQPtrCollection::Item TQLNode::getData() - Returns a pointer (\c void*) to the actual data in the list node. -*/ - - -/*! - \class TQGList tqglist.h - \reentrant - \ingroup collection - \brief The TQGList class is an internal class for implementing TQt collection classes. - - \internal - - TQGList is a strictly internal class that acts as a base class for - several collection classes; TQPtrList, TQPtrQueue and TQPtrStack. - - TQGList has some virtual functions that can be reimplemented to - customize the subclasses, namely compareItems(), read() and - write. Normally, you do not have to reimplement any of these - functions. If you still want to reimplement them, see the TQStrList - class (tqstrlist.h) for an example. -*/ - - -/* Internal helper class for TQGList. Contains some optimization for - the typically case where only one iterators is activre on the list. - */ -class TQGListIteratorList -{ -public: - TQGListIteratorList() - : list(0), iterator(0) { - } - ~TQGListIteratorList() { - notifyClear( TRUE ); - delete list; - } - - void add( TQGListIterator* i ) { - if ( !iterator ) { - iterator = i; - } else if ( list ) { - list->push_front( i ); - } else { - list = new TQValueList<TQGListIterator*>; - list->push_front( i ); - } - } - - void remove( TQGListIterator* i ) { - if ( iterator == i ) { - iterator = 0; - } else if ( list ) { - list->remove( i ); - if ( list->isEmpty() ) { - delete list; - list = 0; - } - } - } - - void notifyClear( bool zeroList ) { - if ( iterator ) { - if ( zeroList ) - iterator->list = 0; - iterator->curNode = 0; - } - if ( list ) { - for ( TQValueList<TQGListIterator*>::Iterator i = list->begin(); i != list->end(); ++i ) { - if ( zeroList ) - (*i)->list = 0; - (*i)->curNode = 0; - } - } - } - - void notifyRemove( TQLNode* n, TQLNode* curNode ) { - if ( iterator ) { - if ( iterator->curNode == n ) - iterator->curNode = curNode; - } - if ( list ) { - for ( TQValueList<TQGListIterator*>::Iterator i = list->begin(); i != list->end(); ++i ) { - if ( (*i)->curNode == n ) - (*i)->curNode = curNode; - } - } - } - -private: - TQValueList<TQGListIterator*>* list; - TQGListIterator* iterator; -}; - - - -/***************************************************************************** - Default implementation of virtual functions - *****************************************************************************/ - -/*! - Documented as TQPtrList::compareItems(). - - Compares \a item1 with \a item2. -*/ -int TQGList::compareItems( TQPtrCollection::Item item1, TQPtrCollection::Item item2 ) -{ - return item1 != item2; // compare pointers -} - -#ifndef TQT_NO_DATASTREAM -/*! - \overload - Reads a collection/list item from the stream \a s and returns a reference - to the stream. - - The default implementation sets \a item to 0. - - \sa write() -*/ - -TQDataStream &TQGList::read( TQDataStream &s, TQPtrCollection::Item &item ) -{ - item = 0; - return s; -} - -/*! - \overload - Writes a collection/list item to the stream \a s and - returns a reference to the stream. - - The default implementation does nothing. - - \sa read() -*/ - -TQDataStream &TQGList::write( TQDataStream &s, TQPtrCollection::Item ) const -{ - return s; -} -#endif // TQT_NO_DATASTREAM - -/***************************************************************************** - TQGList member functions - *****************************************************************************/ - -/*! - Constructs an empty list. -*/ - -TQGList::TQGList() -{ - firstNode = lastNode = curNode = 0; // initialize list - numNodes = 0; - curIndex = -1; - iterators = 0; // initialize iterator list -} - -/*! - Constructs a copy of \a list. -*/ - -TQGList::TQGList( const TQGList & list ) - : TQPtrCollection( list ) -{ - firstNode = lastNode = curNode = 0; // initialize list - numNodes = 0; - curIndex = -1; - iterators = 0; // initialize iterator list - TQLNode *n = list.firstNode; - while ( n ) { // copy all items from list - append( n->data ); - n = n->next; - } -} - -/*! - Removes all items from the list and destroys the list. -*/ - -TQGList::~TQGList() -{ - clear(); - delete iterators; - // Workaround for GCC 2.7.* bug. Compiler constructs 'static' TQGList - // instances twice on the same address and therefore tries to destruct - // twice on the same address! This is insane but let's try not to crash - // here. - iterators = 0; -} - - -/*! - Assigns \a list to this list. -*/ - -TQGList& TQGList::operator=( const TQGList &list ) -{ - if ( &list == this ) - return *this; - - clear(); - if ( list.count() > 0 ) { - TQLNode *n = list.firstNode; - while ( n ) { // copy all items from list - append( n->data ); - n = n->next; - } - curNode = firstNode; - curIndex = 0; - } - return *this; -} - -/*! - Compares this list with \a list. Returns TRUE if the lists - contain the same data, otherwise FALSE. -*/ - -bool TQGList::operator==( const TQGList &list ) const -{ - if ( count() != list.count() ) - return FALSE; - - if ( count() == 0 ) - return TRUE; - - TQLNode *n1 = firstNode; - TQLNode *n2 = list.firstNode; - while ( n1 && n2 ) { - // should be mutable - if ( ( (TQGList*)this )->compareItems( n1->data, n2->data ) != 0 ) - return FALSE; - n1 = n1->next; - n2 = n2->next; - } - - return TRUE; -} - -/*! - \fn uint TQGList::count() const - - Returns the number of items in the list. -*/ - - -/*! - Returns the node at position \a index. Sets this node to current. -*/ - -TQLNode *TQGList::locate( uint index ) -{ - if ( index == (uint)curIndex ) // current node ? - return curNode; - if ( !curNode && firstNode ) { // set current node - curNode = firstNode; - curIndex = 0; - } - register TQLNode *node; - int distance = index - curIndex; // node distance to cur node - bool forward; // direction to traverse - - if ( index >= numNodes ) - return 0; - - if ( distance < 0 ) - distance = -distance; - if ( (uint)distance < index && (uint)distance < numNodes - index ) { - node = curNode; // start from current node - forward = index > (uint)curIndex; - } else if ( index < numNodes - index ) { // start from first node - node = firstNode; - distance = index; - forward = TRUE; - } else { // start from last node - node = lastNode; - distance = numNodes - index - 1; - if ( distance < 0 ) - distance = 0; - forward = FALSE; - } - if ( forward ) { // now run through nodes - while ( distance-- ) - node = node->next; - } else { - while ( distance-- ) - node = node->prev; - } - curIndex = index; // must update index - return curNode = node; -} - - -/*! - Inserts item \a d at its sorted position in the list. -*/ - -void TQGList::inSort( TQPtrCollection::Item d ) -{ - int index = 0; - register TQLNode *n = firstNode; - while ( n && compareItems(n->data,d) < 0 ){ // find position in list - n = n->next; - index++; - } - insertAt( index, d ); -} - - -/*! - Inserts item \a d at the start of the list. -*/ - -void TQGList::prepend( TQPtrCollection::Item d ) -{ - register TQLNode *n = new TQLNode( newItem(d) ); - TQ_CHECK_PTR( n ); - n->prev = 0; - if ( (n->next = firstNode) ) // list is not empty - firstNode->prev = n; - else // initialize list - lastNode = n; - firstNode = curNode = n; // curNode affected - numNodes++; - curIndex = 0; -} - - -/*! - Inserts item \a d at the end of the list. -*/ - -void TQGList::append( TQPtrCollection::Item d ) -{ - register TQLNode *n = new TQLNode( newItem(d) ); - TQ_CHECK_PTR( n ); - n->next = 0; - if ( (n->prev = lastNode) ) // list is not empty - lastNode->next = n; - else // initialize list - firstNode = n; - lastNode = curNode = n; // curNode affected - curIndex = numNodes; - numNodes++; -} - - -/*! - Inserts item \a d at position \a index in the list. -*/ - -bool TQGList::insertAt( uint index, TQPtrCollection::Item d ) -{ - if ( index == 0 ) { - prepend( d ); - return TRUE; - } else if ( index == numNodes ) { - append( d ); - return TRUE; - } - TQLNode *nextNode = locate( index ); - if ( !nextNode ) - return FALSE; - TQLNode *prevNode = nextNode->prev; - register TQLNode *n = new TQLNode( newItem(d) ); - TQ_CHECK_PTR( n ); - nextNode->prev = n; - prevNode->next = n; - n->prev = prevNode; // link new node into list - n->next = nextNode; - curNode = n; // curIndex set by locate() - numNodes++; - return TRUE; -} - - -/*! - Relinks node \a n and makes it the first node in the list. -*/ - -void TQGList::relinkNode( TQLNode *n ) -{ - if ( n == firstNode ) // already first - return; - curNode = n; - unlink(); - n->prev = 0; - if ( (n->next = firstNode) ) // list is not empty - firstNode->prev = n; - else // initialize list - lastNode = n; - firstNode = curNode = n; // curNode affected - numNodes++; - curIndex = 0; -} - - -/*! - Unlinks the current list node and returns a pointer to this node. -*/ - -TQLNode *TQGList::unlink() -{ - if ( curNode == 0 ) // null current node - return 0; - register TQLNode *n = curNode; // unlink this node - if ( n == firstNode ) { // removing first node ? - if ( (firstNode = n->next) ) { - firstNode->prev = 0; - } else { - lastNode = curNode = 0; // list becomes empty - curIndex = -1; - } - } else { - if ( n == lastNode ) { // removing last node ? - lastNode = n->prev; - lastNode->next = 0; - } else { // neither last nor first node - n->prev->next = n->next; - n->next->prev = n->prev; - } - } - - if ( n->next ) { // change current node - curNode = n->next; - } else if ( n->prev ) { - curNode = n->prev; - curIndex--; - } - - if ( iterators ) - iterators->notifyRemove( n, curNode ); - numNodes--; - return n; -} - - -/*! - Removes the node \a n from the list. -*/ - -bool TQGList::removeNode( TQLNode *n ) -{ -#if defined(TQT_CHECK_NULL) - if ( n == 0 || (n->prev && n->prev->next != n) || - (n->next && n->next->prev != n) ) { - qWarning( "TQGList::removeNode: Corrupted node" ); - return FALSE; - } -#endif - curNode = n; - unlink(); // unlink node - deleteItem( n->data ); // deallocate this node - delete n; - curNode = firstNode; - curIndex = curNode ? 0 : -1; - return TRUE; -} - -/*! - Removes the item \a d from the list. Uses compareItems() to find the item. - - If \a d is 0, removes the current item. -*/ - -bool TQGList::remove( TQPtrCollection::Item d ) -{ - if ( d && find(d) == -1 ) - return FALSE; - TQLNode *n = unlink(); - if ( !n ) - return FALSE; - deleteItem( n->data ); - delete n; - return TRUE; -} - -/*! - Removes the item \a d from the list. -*/ - -bool TQGList::removeRef( TQPtrCollection::Item d ) -{ - if ( findRef(d) == -1 ) - return FALSE; - TQLNode *n = unlink(); - if ( !n ) - return FALSE; - deleteItem( n->data ); - delete n; - return TRUE; -} - -/*! - \fn bool TQGList::removeFirst() - - Removes the first item in the list. -*/ - -/*! - \fn bool TQGList::removeLast() - - Removes the last item in the list. -*/ - -/*! - Removes the item at position \a index from the list. -*/ - -bool TQGList::removeAt( uint index ) -{ - if ( !locate(index) ) - return FALSE; - TQLNode *n = unlink(); - if ( !n ) - return FALSE; - deleteItem( n->data ); - delete n; - return TRUE; -} - - -/*! - Replaces the item at index \a index with \a d. -*/ -bool TQGList::replaceAt( uint index, TQPtrCollection::Item d ) -{ - TQLNode *n = locate( index ); - if ( !n ) - return FALSE; - if ( n->data != d ) { - deleteItem( n->data ); - n->data = newItem( d ); - } - return TRUE; -} - - - -/*! - Takes the node \a n out of the list. -*/ - -TQPtrCollection::Item TQGList::takeNode( TQLNode *n ) -{ -#if defined(TQT_CHECK_NULL) - if ( n == 0 || (n->prev && n->prev->next != n) || - (n->next && n->next->prev != n) ) { - qWarning( "TQGList::takeNode: Corrupted node" ); - return 0; - } -#endif - curNode = n; - unlink(); // unlink node - Item d = n->data; - delete n; // delete the node, not data - curNode = firstNode; - curIndex = curNode ? 0 : -1; - return d; -} - -/*! - Takes the current item out of the list. -*/ - -TQPtrCollection::Item TQGList::take() -{ - TQLNode *n = unlink(); // unlink node - Item d = n ? n->data : 0; - delete n; // delete node, keep contents - return d; -} - -/*! - Takes the item at position \a index out of the list. -*/ - -TQPtrCollection::Item TQGList::takeAt( uint index ) -{ - if ( !locate(index) ) - return 0; - TQLNode *n = unlink(); // unlink node - Item d = n ? n->data : 0; - delete n; // delete node, keep contents - return d; -} - -/*! - Takes the first item out of the list. -*/ - -TQPtrCollection::Item TQGList::takeFirst() -{ - first(); - TQLNode *n = unlink(); // unlink node - Item d = n ? n->data : 0; - delete n; - return d; -} - -/*! - Takes the last item out of the list. -*/ - -TQPtrCollection::Item TQGList::takeLast() -{ - last(); - TQLNode *n = unlink(); // unlink node - Item d = n ? n->data : 0; - delete n; - return d; -} - - -/*! - Removes all items from the list. -*/ - -void TQGList::clear() -{ - register TQLNode *n = firstNode; - - firstNode = lastNode = curNode = 0; // initialize list - numNodes = 0; - curIndex = -1; - - if ( iterators ) - iterators->notifyClear( FALSE ); - - TQLNode *prevNode; - while ( n ) { // for all nodes ... - deleteItem( n->data ); // deallocate data - prevNode = n; - n = n->next; - delete prevNode; // deallocate node - } -} - - -/*! - Finds item \a d in the list. If \a fromStart is TRUE the search - begins at the first node; otherwise it begins at the current node. -*/ - -int TQGList::findRef( TQPtrCollection::Item d, bool fromStart ) -{ - register TQLNode *n; - int index; - if ( fromStart ) { // start from first node - n = firstNode; - index = 0; - } else { // start from current node - n = curNode; - index = curIndex; - } - while ( n && n->data != d ) { // find exact match - n = n->next; - index++; - } - curNode = n; - curIndex = n ? index : -1; - return curIndex; // return position of item -} - -/*! - Finds item \a d in the list using compareItems(). If \a fromStart is - TRUE the search begins at the first node; otherwise it begins at the - current node. -*/ - -int TQGList::find( TQPtrCollection::Item d, bool fromStart ) -{ - register TQLNode *n; - int index; - if ( fromStart ) { // start from first node - n = firstNode; - index = 0; - } else { // start from current node - n = curNode; - index = curIndex; - } - while ( n && compareItems(n->data,d) ){ // find equal match - n = n->next; - index++; - } - curNode = n; - curIndex = n ? index : -1; - return curIndex; // return position of item -} - - -/*! - Counts the number item \a d occurs in the list. -*/ - -uint TQGList::containsRef( TQPtrCollection::Item d ) const -{ - register TQLNode *n = firstNode; - uint count = 0; - while ( n ) { // for all nodes... - if ( n->data == d ) // count # exact matches - count++; - n = n->next; - } - return count; -} - -/*! - Counts the number of times item \a d occurs in the list. Uses - compareItems(). -*/ - -uint TQGList::contains( TQPtrCollection::Item d ) const -{ - register TQLNode *n = firstNode; - uint count = 0; - TQGList *that = (TQGList*)this; // mutable for compareItems() - while ( n ) { // for all nodes... - if ( !that->compareItems(n->data,d) ) // count # equal matches - count++; - n = n->next; - } - return count; -} - - -/*! - \overload TQPtrCollection::Item TQGList::at( uint index ) - - Sets the item at position \a index to the current item. -*/ - -/*! - \fn int TQGList::at() const - - Returns the current index. -*/ - -/*! - \fn TQLNode *TQGList::currentNode() const - - Returns the current node. -*/ - -/*! - \fn TQPtrCollection::Item TQGList::get() const - - Returns the current item. -*/ - -/*! - \fn TQPtrCollection::Item TQGList::cfirst() const - - Returns the first item in the list. -*/ - -/*! - \fn TQPtrCollection::Item TQGList::clast() const - - Returns the last item in the list. -*/ - - -/*! - Returns the first list item. Sets this to current. -*/ - -TQPtrCollection::Item TQGList::first() -{ - if ( firstNode ) { - curIndex = 0; - return (curNode=firstNode)->data; - } - return 0; -} - -/*! - Returns the last list item. Sets this to current. -*/ - -TQPtrCollection::Item TQGList::last() -{ - if ( lastNode ) { - curIndex = numNodes-1; - return (curNode=lastNode)->data; - } - return 0; -} - -/*! - Returns the next list item (after current). Sets this to current. -*/ - -TQPtrCollection::Item TQGList::next() -{ - if ( curNode ) { - if ( curNode->next ) { - curIndex++; - curNode = curNode->next; - return curNode->data; - } - curIndex = -1; - curNode = 0; - } - return 0; -} - -/*! - Returns the previous list item (before current). Sets this to current. -*/ - -TQPtrCollection::Item TQGList::prev() -{ - if ( curNode ) { - if ( curNode->prev ) { - curIndex--; - curNode = curNode->prev; - return curNode->data; - } - curIndex = -1; - curNode = 0; - } - return 0; -} - - -/*! - Converts the list to a vector, \a vector. -*/ - -void TQGList::toVector( TQGVector *vector ) const -{ - vector->clear(); - if ( !vector->resize( count() ) ) - return; - register TQLNode *n = firstNode; - uint i = 0; - while ( n ) { - vector->insert( i, n->data ); - n = n->next; - i++; - } -} - -void TQGList::heapSortPushDown( TQPtrCollection::Item* heap, int first, int last ) -{ - int r = first; - while( r <= last/2 ) { - // Node r has only one child ? - if ( last == 2*r ) { - // Need for swapping ? - if ( compareItems( heap[r], heap[ 2*r ] ) > 0 ) { - TQPtrCollection::Item tmp = heap[r]; - heap[ r ] = heap[ 2*r ]; - heap[ 2*r ] = tmp; - } - // That's it ... - r = last; - } else { - // Node has two tqchildren - if ( compareItems( heap[r], heap[ 2*r ] ) > 0 && - compareItems( heap[ 2*r ], heap[ 2*r+1 ] ) <= 0 ) { - // Swap with left child - TQPtrCollection::Item tmp = heap[r]; - heap[ r ] = heap[ 2*r ]; - heap[ 2*r ] = tmp; - r *= 2; - } else if ( compareItems( heap[r], heap[ 2*r+1 ] ) > 0 && - compareItems( heap[ 2*r+1 ], heap[ 2*r ] ) < 0 ) { - // Swap with right child - TQPtrCollection::Item tmp = heap[r]; - heap[ r ] = heap[ 2*r+1 ]; - heap[ 2*r+1 ] = tmp; - r = 2*r+1; - } else { - // We are done - r = last; - } - } - } -} - - -/*! Sorts the list by the result of the virtual compareItems() function. - - The Heap-Sort algorithm is used for sorting. It sorts n items with - O(n*log n) compares. This is the asymptotic optimal solution of the - sorting problem. -*/ - -void TQGList::sort() -{ - uint n = count(); - if ( n < 2 ) - return; - - // Create the heap - TQPtrCollection::Item* realheap = new TQPtrCollection::Item[ n ]; - // Wow, what a fake. But I want the heap to be indexed as 1...n - TQPtrCollection::Item* heap = realheap - 1; - int size = 0; - TQLNode* insert = firstNode; - for( ; insert != 0; insert = insert->next ) { - heap[++size] = insert->data; - int i = size; - while( i > 1 && compareItems( heap[i], heap[ i / 2 ] ) < 0 ) { - TQPtrCollection::Item tmp = heap[ i ]; - heap[ i ] = heap[ i/2 ]; - heap[ i/2 ] = tmp; - i /= 2; - } - } - - insert = firstNode; - // Now do the sorting - for ( int i = n; i > 0; i-- ) { - insert->data = heap[1]; - insert = insert->next; - if ( i > 1 ) { - heap[1] = heap[i]; - heapSortPushDown( heap, 1, i - 1 ); - } - } - - delete [] realheap; -} - - -/***************************************************************************** - TQGList stream functions - *****************************************************************************/ - -#ifndef TQT_NO_DATASTREAM -TQDataStream &operator>>( TQDataStream &s, TQGList &list ) -{ // read list - return list.read( s ); -} - -TQDataStream &operator<<( TQDataStream &s, const TQGList &list ) -{ // write list - return list.write( s ); -} - -/*! - Reads a list from the stream \a s. -*/ - -TQDataStream &TQGList::read( TQDataStream &s ) -{ - uint num; - s >> num; // read number of items - clear(); // clear list - while ( num-- ) { // read all items - Item d; - read( s, d ); - TQ_CHECK_PTR( d ); - if ( !d ) // no memory - break; - TQLNode *n = new TQLNode( d ); - TQ_CHECK_PTR( n ); - if ( !n ) // no memory - break; - n->next = 0; - if ( (n->prev = lastNode) ) // list is not empty - lastNode->next = n; - else // initialize list - firstNode = n; - lastNode = n; - numNodes++; - } - curNode = firstNode; - curIndex = curNode ? 0 : -1; - return s; -} - -/*! - Writes the list to the stream \a s. -*/ - -TQDataStream &TQGList::write( TQDataStream &s ) const -{ - s << count(); // write number of items - TQLNode *n = firstNode; - while ( n ) { // write all items - write( s, n->data ); - n = n->next; - } - return s; -} - -#endif // TQT_NO_DATASTREAM - - - -/*! \internal - */ -TQLNode* TQGList::erase( TQLNode* it ) -{ - TQLNode* n = it; - it = it->next; - removeNode( n ); - return it; -} - - -/***************************************************************************** - TQGListIterator member functions - *****************************************************************************/ - -/*! - \class TQGListIterator tqglist.h - \reentrant - \ingroup collection - \brief The TQGListIterator class is an internal class for implementing TQPtrListIterator. - - \internal - - TQGListIterator is a strictly internal class that does the heavy work for - TQPtrListIterator. -*/ - -/*! - \internal - Constructs an iterator that operates on the list \a l. -*/ - -TQGListIterator::TQGListIterator( const TQGList &l ) -{ - list = (TQGList *)&l; // get reference to list - curNode = list->firstNode; // set to first node - if ( !list->iterators ) { - list->iterators = new TQGListIteratorList; // create iterator list - TQ_CHECK_PTR( list->iterators ); - } - list->iterators->add( this ); // attach iterator to list -} - -/*! - \internal - Constructs a copy of the iterator \a it. -*/ - -TQGListIterator::TQGListIterator( const TQGListIterator &it ) -{ - list = it.list; - curNode = it.curNode; - if ( list ) - list->iterators->add( this ); // attach iterator to list -} - -/*! - \internal - Assigns a copy of the iterator \a it and returns a reference to this - iterator. -*/ - -TQGListIterator &TQGListIterator::operator=( const TQGListIterator &it ) -{ - if ( list ) // detach from old list - list->iterators->remove( this ); - list = it.list; - curNode = it.curNode; - if ( list ) - list->iterators->add( this ); // attach to new list - return *this; -} - -/*! - \internal - Destroys the iterator. -*/ - -TQGListIterator::~TQGListIterator() -{ - if ( list ) // detach iterator from list - list->iterators->remove(this); -} - - -/*! - \fn bool TQGListIterator::atFirst() const - \internal - Returns TRUE if the iterator points to the first item, otherwise FALSE. -*/ - -/*! - \fn bool TQGListIterator::atLast() const - \internal - Returns TRUE if the iterator points to the last item, otherwise FALSE. -*/ - - -/*! - \internal - Sets the list iterator to point to the first item in the list. -*/ - -TQPtrCollection::Item TQGListIterator::toFirst() -{ - if ( !list ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQGListIterator::toFirst: List has been deleted" ); -#endif - return 0; - } - return list->firstNode ? (curNode = list->firstNode)->getData() : 0; -} - -/*! - \internal - Sets the list iterator to point to the last item in the list. -*/ - -TQPtrCollection::Item TQGListIterator::toLast() -{ - if ( !list ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQGListIterator::toLast: List has been deleted" ); -#endif - return 0; - } - return list->lastNode ? (curNode = list->lastNode)->getData() : 0; -} - - -/*! - \fn TQPtrCollection::Item TQGListIterator::get() const - \internal - Returns the iterator item. -*/ - - -/*! - \internal - Moves to the next item (postfix). -*/ - -TQPtrCollection::Item TQGListIterator::operator()() -{ - if ( !curNode ) - return 0; - TQPtrCollection::Item d = curNode->getData(); - curNode = curNode->next; - return d; -} - -/*! - \internal - Moves to the next item (prefix). -*/ - -TQPtrCollection::Item TQGListIterator::operator++() -{ - if ( !curNode ) - return 0; - curNode = curNode->next; - return curNode ? curNode->getData() : 0; -} - -/*! - \internal - Moves \a jumps positions forward. -*/ - -TQPtrCollection::Item TQGListIterator::operator+=( uint jumps ) -{ - while ( curNode && jumps-- ) - curNode = curNode->next; - return curNode ? curNode->getData() : 0; -} - -/*! - \internal - Moves to the previous item (prefix). -*/ - -TQPtrCollection::Item TQGListIterator::operator--() -{ - if ( !curNode ) - return 0; - curNode = curNode->prev; - return curNode ? curNode->getData() : 0; -} - -/*! - \internal - Moves \a jumps positions backward. -*/ - -TQPtrCollection::Item TQGListIterator::operator-=( uint jumps ) -{ - while ( curNode && jumps-- ) - curNode = curNode->prev; - return curNode ? curNode->getData() : 0; -} diff --git a/tqtinterface/qt4/src/tools/tqglist.h b/tqtinterface/qt4/src/tools/tqglist.h deleted file mode 100644 index ebbd616..0000000 --- a/tqtinterface/qt4/src/tools/tqglist.h +++ /dev/null @@ -1,271 +0,0 @@ -/**************************************************************************** -** -** Definition of TQGList and TQGListIterator classes -** -** Created : 920624 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQGLIST_H -#define TQGLIST_H - -#ifndef TQT_H -#include "tqptrcollection.h" -#endif // TQT_H - -class TQ_EXPORT TQLNode -{ -friend class TQGList; -friend class TQGListIterator; -friend class TQGListStdIterator; -public: - TQPtrCollection::Item getData() { return data; } -private: - TQPtrCollection::Item data; - TQLNode *prev; - TQLNode *next; - TQLNode( TQPtrCollection::Item d ) { data = d; } -}; - -class TQGListIteratorList; // internal helper class - -class TQ_EXPORT TQGList : public TQPtrCollection // doubly linked generic list -{ -friend class TQGListIterator; -friend class TQGListIteratorList; -friend class TQGVector; // needed by TQGVector::toList -public: - uint count() const; // return number of nodes - -#ifndef TQT_NO_DATASTREAM - TQDataStream &read( TQDataStream & ); // read list from stream - TQDataStream &write( TQDataStream & ) const; // write list to stream -#endif -protected: - TQGList(); // create empty list - TQGList( const TQGList & ); // make copy of other list - virtual ~TQGList(); - - TQGList &operator=( const TQGList & ); // assign from other list - bool operator==( const TQGList& ) const; - - void inSort( TQPtrCollection::Item ); // add item sorted in list - void append( TQPtrCollection::Item ); // add item at end of list - bool insertAt( uint index, TQPtrCollection::Item ); // add item at i'th position - void relinkNode( TQLNode * ); // relink as first item - bool removeNode( TQLNode * ); // remove node - bool remove( TQPtrCollection::Item = 0 ); // remove item (0=current) - bool removeRef( TQPtrCollection::Item = 0 ); // remove item (0=current) - bool removeFirst(); // remove first item - bool removeLast(); // remove last item - bool removeAt( uint ); // remove item at i'th position - bool replaceAt( uint, TQPtrCollection::Item ); // replace item at position i with item - TQPtrCollection::Item takeNode( TQLNode * ); // take out node - TQPtrCollection::Item take(); // take out current item - TQPtrCollection::Item takeAt( uint index ); // take out item at i'th pos - TQPtrCollection::Item takeFirst(); // take out first item - TQPtrCollection::Item takeLast(); // take out last item - - void sort(); // sort all items; - void clear(); // remove all items - - int findRef( TQPtrCollection::Item, bool = TRUE ); // find exact item in list - int find( TQPtrCollection::Item, bool = TRUE ); // find equal item in list - - uint containsRef( TQPtrCollection::Item ) const; // get number of exact matches - uint contains( TQPtrCollection::Item ) const; // get number of equal matches - - TQPtrCollection::Item at( uint index ); // access item at i'th pos - int at() const; // get current index - TQLNode *currentNode() const; // get current node - - TQPtrCollection::Item get() const; // get current item - - TQPtrCollection::Item cfirst() const; // get ptr to first list item - TQPtrCollection::Item clast() const; // get ptr to last list item - TQPtrCollection::Item first(); // set first item in list curr - TQPtrCollection::Item last(); // set last item in list curr - TQPtrCollection::Item next(); // set next item in list curr - TQPtrCollection::Item prev(); // set prev item in list curr - - void toVector( TQGVector * ) const; // put items in vector - - virtual int compareItems( TQPtrCollection::Item, TQPtrCollection::Item ); - -#ifndef TQT_NO_DATASTREAM - virtual TQDataStream &read( TQDataStream &, TQPtrCollection::Item & ); - virtual TQDataStream &write( TQDataStream &, TQPtrCollection::Item ) const; -#endif - - TQLNode* begin() const { return firstNode; } - TQLNode* end() const { return 0; } - TQLNode* erase( TQLNode* it ); - -private: - void prepend( TQPtrCollection::Item ); // add item at start of list - - void heapSortPushDown( TQPtrCollection::Item* heap, int first, int last ); - - TQLNode *firstNode; // first node - TQLNode *lastNode; // last node - TQLNode *curNode; // current node - int curIndex; // current index - uint numNodes; // number of nodes - TQGListIteratorList *iterators; // list of iterators - - TQLNode *locate( uint ); // get node at i'th pos - TQLNode *unlink(); // unlink node -}; - - -inline uint TQGList::count() const -{ - return numNodes; -} - -inline bool TQGList::removeFirst() -{ - first(); - return remove(); -} - -inline bool TQGList::removeLast() -{ - last(); - return remove(); -} - -inline int TQGList::at() const -{ - return curIndex; -} - -inline TQPtrCollection::Item TQGList::at( uint index ) -{ - TQLNode *n = locate( index ); - return n ? n->data : 0; -} - -inline TQLNode *TQGList::currentNode() const -{ - return curNode; -} - -inline TQPtrCollection::Item TQGList::get() const -{ - return curNode ? curNode->data : 0; -} - -inline TQPtrCollection::Item TQGList::cfirst() const -{ - return firstNode ? firstNode->data : 0; -} - -inline TQPtrCollection::Item TQGList::clast() const -{ - return lastNode ? lastNode->data : 0; -} - - -/***************************************************************************** - TQGList stream functions - *****************************************************************************/ - -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQGList & ); -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQGList & ); -#endif - -/***************************************************************************** - TQGListIterator class - *****************************************************************************/ - -class TQ_EXPORT TQGListIterator // TQGList iterator -{ -friend class TQGList; -friend class TQGListIteratorList; -protected: - TQGListIterator( const TQGList & ); - TQGListIterator( const TQGListIterator & ); - TQGListIterator &operator=( const TQGListIterator & ); - ~TQGListIterator(); - - bool atFirst() const; // test if at first item - bool atLast() const; // test if at last item - TQPtrCollection::Item toFirst(); // move to first item - TQPtrCollection::Item toLast(); // move to last item - - TQPtrCollection::Item get() const; // get current item - TQPtrCollection::Item operator()(); // get current and move to next - TQPtrCollection::Item operator++(); // move to next item (prefix) - TQPtrCollection::Item operator+=(uint); // move n positions forward - TQPtrCollection::Item operator--(); // move to prev item (prefix) - TQPtrCollection::Item operator-=(uint); // move n positions backward - -protected: - TQGList *list; // reference to list - -private: - TQLNode *curNode; // current node in list -}; - - -inline bool TQGListIterator::atFirst() const -{ - return curNode == list->firstNode; -} - -inline bool TQGListIterator::atLast() const -{ - return curNode == list->lastNode; -} - -inline TQPtrCollection::Item TQGListIterator::get() const -{ - return curNode ? curNode->data : 0; -} - -class TQ_EXPORT TQGListStdIterator -{ -public: - inline TQGListStdIterator( TQLNode* n ) : node( n ){} - inline operator TQLNode* () { return node; } -protected: - inline TQLNode *next() { return node->next; } - TQLNode *node; -}; - - -#endif // TQGLIST_H diff --git a/tqtinterface/qt4/src/tools/tqglobal.cpp b/tqtinterface/qt4/src/tools/tqglobal.cpp deleted file mode 100644 index dd5528b..0000000 --- a/tqtinterface/qt4/src/tools/tqglobal.cpp +++ /dev/null @@ -1,927 +0,0 @@ -/**************************************************************************** -** -** Global functions -** -** Created : 920604 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" - -#include "tqasciidict.h" -#include <limits.h> -#include <stdio.h> -#include <limits.h> -#include <stdarg.h> -#include <stdlib.h> - -#if defined(TQ_CC_MSVC) && !defined(TQ_CC_MSVC_NET) && !defined(TQ_OS_TEMP) -#include <crtdbg.h> -#endif - - -/*! - \relates TQApplication - - Returns the TQt version number as a string, for example, "2.3.0" or - "3.0.5". - - The \c TQT_VERSION define has the numeric value in the form: - 0xmmiibb (m = major, i = minor, b = bugfix). For example, TQt - 3.0.5's \c TQT_VERSION is 0x030005. -*/ - -const char *qVersion() -{ - return TQT_VERSION_STR; -} - -bool qSharedBuild() -{ -#ifdef TQT_SHARED - return TRUE; -#else - return FALSE; -#endif -} - -/***************************************************************************** - System detection routines - *****************************************************************************/ - -static bool si_alreadyDone = FALSE; -static int si_wordSize; -static bool si_bigEndian; - -/*! - \relates TQApplication - - Obtains information about the system. - - The system's word size in bits (typically 32) is returned in \a - *wordSize. The \a *bigEndian is set to TRUE if this is a big-endian - machine, or to FALSE if this is a little-endian machine. - - In debug mode, this function calls qFatal() with a message if the - computer is truly weird (i.e. different endianness for 16 bit and - 32 bit integers); in release mode it returns FALSE. -*/ - -bool qSysInfo( int *wordSize, bool *bigEndian ) -{ -#if defined(TQT_CHECK_NULL) - TQ_ASSERT( wordSize != 0 ); - TQ_ASSERT( bigEndian != 0 ); -#endif - - if ( si_alreadyDone ) { // run it only once - *wordSize = si_wordSize; - *bigEndian = si_bigEndian; - return TRUE; - } - - si_wordSize = 0; - TQ_ULONG n = (TQ_ULONG)(~0); - while ( n ) { // detect word size - si_wordSize++; - n /= 2; - } - *wordSize = si_wordSize; - - if ( *wordSize != 64 && - *wordSize != 32 && - *wordSize != 16 ) { // word size: 16, 32 or 64 -#if defined(TQT_CHECK_RANGE) - qFatal( "qSysInfo: Unsupported system word size %d", *wordSize ); -#endif - return FALSE; - } - if ( sizeof(TQ_INT8) != 1 || sizeof(TQ_INT16) != 2 || sizeof(TQ_INT32) != 4 || - sizeof(TQ_ULONG)*8 != si_wordSize || sizeof(float) != 4 || sizeof(double) != 8 ) { -#if defined(TQT_CHECK_RANGE) - qFatal( "qSysInfo: Unsupported system data type size" ); -#endif - return FALSE; - } - - bool be16, be32; // determine byte ordering - short ns = 0x1234; - int nl = 0x12345678; - - unsigned char *p = (unsigned char *)(&ns); // 16-bit integer - be16 = *p == 0x12; - - p = (unsigned char *)(&nl); // 32-bit integer - if ( p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78 ) - be32 = TRUE; - else - if ( p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] == 0x12 ) - be32 = FALSE; - else - be32 = !be16; - - if ( be16 != be32 ) { // strange machine! -#if defined(TQT_CHECK_RANGE) - qFatal( "qSysInfo: Inconsistent system byte order" ); -#endif - return FALSE; - } - - *bigEndian = si_bigEndian = be32; - si_alreadyDone = TRUE; - return TRUE; -} - -#if !defined(TQWS) && defined(TQ_OS_MAC) - -#include "tqt_mac.h" - -// This function has descended from Apple Source Code (FSpLocationFromFullPath), -// but changes have been made. [Creates a minimal alias from the full pathname] -OSErr qt_mac_create_fsspec(const TQString &file, FSSpec *spec) -{ - FSRef fref; - TQCString utfs = file.utf8(); - OSErr ret = FSPathMakeRef((const UInt8 *)utfs.data(), &fref, NULL); - if(ret == noErr) - ret = FSGetCatalogInfo(&fref, kFSCatInfoNone, NULL, NULL, spec, NULL); - return ret; -} - -CFStringRef qstring2cfstring(const TQString &str) -{ - return CFStringCreateWithCharacters(0, (UniChar *)str.tqunicode(), str.length()); -} - -TQString cfstring2qstring(CFStringRef str) -{ - if(!str) - return TQString(); - - CFIndex length = CFStringGetLength(str); - if(const UniChar *chars = CFStringGetCharactersPtr(str)) - return TQString((TQChar *)chars, length); - UniChar *buffer = (UniChar*)malloc(length * sizeof(UniChar)); - CFStringGetCharacters(str, CFRangeMake(0, length), buffer); - TQString ret((TQChar *)buffer, length); - free(buffer); - return ret; -} - -unsigned char *p_str(const TQString &s) -{ - CFStringRef cfstr = qstring2cfstring(s); - uchar *p = (uchar*)malloc(256); - CFStringGetPascalString(cfstr, p, 256, CFStringGetSystemEncoding()); - CFRelease(cfstr); - return p; -} - -TQString p2qstring(const unsigned char *c) { - CFStringRef cfstr = CFStringCreateWithPascalString(0, c, CFStringGetSystemEncoding()); - TQString str = cfstring2qstring(cfstr); - CFRelease(cfstr); - return str; -} - -int qMacVersion() -{ - static int macver = TQt::MV_Unknown; - static bool first = TRUE; - if(first) { - first = FALSE; - long gestalt_version; - if(Gestalt(gestaltSystemVersion, &gestalt_version) == noErr) { - macver = ((gestalt_version & 0x00f0) >> 4) + 2; - - } - } - return macver; -} -TQt::MacintoshVersion qt_macver = (TQt::MacintoshVersion)qMacVersion(); - -// HFS+ filesystems use decomposing tqunicode for certain layers in tqunicode -// In general these don't look great as a user visible string. -// Therefore it is a good idea to normalize them ourselves. -// These technotes on Apple's website: -// http://developer.apple.com/qa/qa2001/qa1235.html -// http://developer.apple.com/qa/qa2001/qa1173.html -TQString qt_mac_precomposeFileName(const TQString &str) -{ - if (str.isEmpty()) - return str; - int strLength = str.length(); - CFMutableStringRef cfmstr = CFStringCreateMutable(0, strLength); - CFStringAppendCharacters(cfmstr, (UniChar *)str.tqunicode(), strLength); - CFStringNormalize(cfmstr, kCFStringNormalizationFormC); - TQString newStr = cfstring2qstring(cfmstr); - CFRelease(cfmstr); - return newStr; -} -#elif defined(TQ_OS_WIN32) || defined(TQ_OS_CYGWIN) || defined(TQ_OS_TEMP) -bool qt_wintqunicode; -# ifdef TQ_OS_TEMP - DWORD qt_cever = 0; -# endif // TQ_OS_TEMP - -#include "tqt_windows.h" - -int qWinVersion() -{ -#ifndef VER_PLATFORM_WIN32s -#define VER_PLATFORM_WIN32s 0 -#endif -#ifndef VER_PLATFORM_WIN32_WINDOWS -#define VER_PLATFORM_WIN32_WINDOWS 1 -#endif -#ifndef VER_PLATFORM_WIN32_NT -#define VER_PLATFORM_WIN32_NT 2 -#endif -#ifndef VER_PLATFORM_WIN32_CE -#define VER_PLATFORM_WIN32_CE 3 -#endif - - static int winver = TQt::WV_NT; - static int t=0; - if ( !t ) { - t=1; -#ifndef TQ_OS_TEMP - OSVERSIONINFOA osver; - osver.dwOSVersionInfoSize = sizeof(osver); - GetVersionExA( &osver ); -#else - OSVERSIONINFOW osver; - osver.dwOSVersionInfoSize = sizeof(osver); - GetVersionEx( &osver ); - qt_cever = osver.dwMajorVersion * 100; - qt_cever += osver.dwMinorVersion * 10; -#endif - switch ( osver.dwPlatformId ) { - case VER_PLATFORM_WIN32s: - winver = TQt::WV_32s; - break; - case VER_PLATFORM_WIN32_WINDOWS: - // We treat Windows Me (minor 90) the same as Windows 98 - if ( osver.dwMinorVersion == 90 ) - winver = TQt::WV_Me; - else if ( osver.dwMinorVersion == 10 ) - winver = TQt::WV_98; - else - winver = TQt::WV_95; - break; - case VER_PLATFORM_WIN32_CE: -#ifdef TQ_OS_TEMP - if ( qt_cever >= 400 ) - winver = TQt::WV_CENET; - else -#endif - winver = TQt::WV_CE; - break; - default: // VER_PLATFORM_WIN32_NT - if ( osver.dwMajorVersion < 5 ) { - winver = TQt::WV_NT; - } else if (osver.dwMajorVersion == 6) { - winver = TQt::WV_VISTA; - } else if ( osver.dwMinorVersion == 0 ) { - winver = TQt::WV_2000; - } else if ( osver.dwMinorVersion == 1 ) { - winver = TQt::WV_XP; - } else if ( osver.dwMinorVersion == 2 ) { - winver = TQt::WV_2003; - } else { - qWarning("Untested Windows version detected!"); - winver = TQt::WV_NT_based; - } - } - } - -#if defined(UNICODE) - if ( winver & TQt::WV_NT_based ) - qt_wintqunicode = TRUE; - else -#endif - qt_wintqunicode = FALSE; - - return winver; -} - -TQt::WindowsVersion qt_winver = (TQt::WindowsVersion)qWinVersion(); -#endif - - -/***************************************************************************** - Debug output routines - *****************************************************************************/ - -/*! - \fn void qDebug( const char *msg, ... ) - - \relates TQApplication - - Prints a debug message \a msg, or calls the message handler (if it - has been installed). - - This function takes a format string and a list of arguments, - similar to the C printf() function. - - Example: - \code - qDebug( "my window handle = %x", myWidget->id() ); - \endcode - - Under X11, the text is printed to stderr. Under Windows, the text - is sent to the debugger. - - \warning The internal buffer is limited to 8196 bytes (including - the '\0'-terminator). - - \warning Passing (const char *)0 as argument to qDebug might lead - to crashes on certain platforms due to the platforms printf implementation. - - \sa qWarning(), qFatal(), tqInstallMsgHandler(), - \link debug.html Debugging\endlink -*/ - -/*! - \fn void qWarning( const char *msg, ... ) - - \relates TQApplication - - Prints a warning message \a msg, or calls the message handler (if - it has been installed). - - This function takes a format string and a list of arguments, - similar to the C printf() function. - - Example: - \code - void f( int c ) - { - if ( c > 200 ) - qWarning( "f: bad argument, c == %d", c ); - } - \endcode - - Under X11, the text is printed to stderr. Under Windows, the text - is sent to the debugger. - - \warning The internal buffer is limited to 8196 bytes (including - the '\0'-terminator). - - \warning Passing (const char *)0 as argument to qWarning might lead - to crashes on certain platforms due to the platforms printf implementation. - - \sa qDebug(), qFatal(), tqInstallMsgHandler(), - \link debug.html Debugging\endlink -*/ - -/*! - \fn void qFatal( const char *msg, ... ) - - \relates TQApplication - - Prints a fatal error message \a msg and exits, or calls the - message handler (if it has been installed). - - This function takes a format string and a list of arguments, - similar to the C printf() function. - - Example: - \code - int divide( int a, int b ) - { - if ( b == 0 ) // program error - qFatal( "divide: cannot divide by zero" ); - return a/b; - } - \endcode - - Under X11, the text is printed to stderr. Under Windows, the text - is sent to the debugger. - - \warning The internal buffer is limited to 8196 bytes (including - the '\0'-terminator). - - \warning Passing (const char *)0 as argument to qFatal might lead - to crashes on certain platforms due to the platforms printf implementation. - - \sa qDebug(), qWarning(), tqInstallMsgHandler(), - \link debug.html Debugging\endlink -*/ - - -static TQtMsgHandler handler = 0; // pointer to debug handler -static const int TQT_BUFFER_LENGTH = 8196; // internal buffer length - - -#ifdef TQ_CC_MWERKS - -#include "tqt_mac.h" - -extern bool qt_is_gui_used; -static void mac_default_handler( const char *msg ) -{ - if ( qt_is_gui_used ) { - const unsigned char *p = p_str(msg); - DebugStr(p); - free((void*)p); - } else { - fprintf( stderr, msg ); - } -} - -#endif - - -void qDebug( const char *msg, ... ) -{ - char buf[TQT_BUFFER_LENGTH]; - va_list ap; - va_start( ap, msg ); // use variable arg list -#if defined(TQT_VSNPRINTF) - TQT_VSNPRINTF( buf, TQT_BUFFER_LENGTH, msg, ap ); -#else - vsprintf( buf, msg, ap ); -#endif - va_end( ap ); - if ( handler ) { - (*handler)( TQtDebugMsg, buf ); - } else { -#if defined(TQ_CC_MWERKS) - mac_default_handler(buf); -#elif defined(TQ_OS_TEMP) - TQString fstr( buf ); - OutputDebugString( (fstr + "\n").ucs2() ); -#else - fprintf( stderr, "%s\n", buf ); // add newline -#endif - } -} - -// copied... this looks really bad. -void debug( const char *msg, ... ) -{ - char buf[TQT_BUFFER_LENGTH]; - va_list ap; - va_start( ap, msg ); // use variable arg list -#if defined(TQT_VSNPRINTF) - TQT_VSNPRINTF( buf, TQT_BUFFER_LENGTH, msg, ap ); -#else - vsprintf( buf, msg, ap ); -#endif - va_end( ap ); - if ( handler ) { - (*handler)( TQtDebugMsg, buf ); - } else { -#if defined(TQ_CC_MWERKS) - mac_default_handler(buf); -#elif defined(TQ_OS_TEMP) - TQString fstr( buf ); - OutputDebugString( (fstr + "\n").ucs2() ); -#else - fprintf( stderr, "%s\n", buf ); // add newline -#endif - } -} - -void qWarning( const char *msg, ... ) -{ - char buf[TQT_BUFFER_LENGTH]; - va_list ap; - va_start( ap, msg ); // use variable arg list -#if defined(TQT_VSNPRINTF) - TQT_VSNPRINTF( buf, TQT_BUFFER_LENGTH, msg, ap ); -#else - vsprintf( buf, msg, ap ); -#endif - va_end( ap ); - if ( handler ) { - (*handler)( TQtWarningMsg, buf ); - } else { -#if defined(TQ_CC_MWERKS) - mac_default_handler(buf); -#elif defined(TQ_OS_TEMP) - TQString fstr( buf ); - OutputDebugString( (fstr + "\n").ucs2() ); -#else - fprintf( stderr, "%s\n", buf ); // add newline -#endif - } -} - - -// again, copied -void warning( const char *msg, ... ) -{ - char buf[TQT_BUFFER_LENGTH]; - va_list ap; - va_start( ap, msg ); // use variable arg list -#if defined(TQT_VSNPRINTF) - TQT_VSNPRINTF( buf, TQT_BUFFER_LENGTH, msg, ap ); -#else - vsprintf( buf, msg, ap ); -#endif - va_end( ap ); - if ( handler ) { - (*handler)( TQtWarningMsg, buf ); - } else { -#if defined(TQ_CC_MWERKS) - mac_default_handler(buf); -#elif defined(TQ_OS_TEMP) - TQString fstr( buf ); - OutputDebugString( (fstr + "\n").ucs2() ); -#else - fprintf( stderr, "%s\n", buf ); // add newline -#endif - } -} - -void qFatal( const char *msg, ... ) -{ - char buf[TQT_BUFFER_LENGTH]; - va_list ap; - va_start( ap, msg ); // use variable arg list -#if defined(TQT_VSNPRINTF) - TQT_VSNPRINTF( buf, TQT_BUFFER_LENGTH, msg, ap ); -#else - vsprintf( buf, msg, ap ); -#endif - va_end( ap ); - if ( handler ) { - (*handler)( TQtFatalMsg, buf ); - } else { -#if defined(TQ_CC_MWERKS) - mac_default_handler(buf); -#else - fprintf( stderr, "%s\n", buf ); // add newline -#endif -#if defined(TQ_OS_UNIX) && defined(TQT_DEBUG) - abort(); // trap; generates core dump -#elif defined(TQ_OS_TEMP) && defined(TQT_DEBUG) - TQString fstr; - fstr.sprintf( "%s:%s %s %s\n", __FILE__, __LINE__, TQT_VERSION_STR, buf ); - OutputDebugString( fstr.ucs2() ); -#elif defined(_CRT_ERROR) && defined(_DEBUG) - _CrtDbgReport( _CRT_ERROR, __FILE__, __LINE__, TQT_VERSION_STR, buf ); -#else - exit( 1 ); // goodbye cruel world -#endif - } -} - -// yet again, copied -void fatal( const char *msg, ... ) -{ - char buf[TQT_BUFFER_LENGTH]; - va_list ap; - va_start( ap, msg ); // use variable arg list -#if defined(TQT_VSNPRINTF) - TQT_VSNPRINTF( buf, TQT_BUFFER_LENGTH, msg, ap ); -#else - vsprintf( buf, msg, ap ); -#endif - va_end( ap ); - if ( handler ) { - (*handler)( TQtFatalMsg, buf ); - } else { -#if defined(TQ_CC_MWERKS) - mac_default_handler(buf); -#else - fprintf( stderr, "%s\n", buf ); // add newline -#endif -#if defined(TQ_OS_UNIX) && defined(TQT_DEBUG) - abort(); // trap; generates core dump -#elif defined(TQ_OS_TEMP) && defined(TQT_DEBUG) - TQString fstr; - fstr.sprintf( "%s:%s %s %s\n", __FILE__, __LINE__, TQT_VERSION_STR, buf ); - OutputDebugString( fstr.ucs2() ); -#elif defined(_CRT_ERROR) && defined(_DEBUG) - _CrtDbgReport( _CRT_ERROR, __FILE__, __LINE__, TQT_VERSION_STR, buf ); -#else - exit( 1 ); // goodbye cruel world -#endif - } -} - -/*! - \relates TQApplication - - Prints the message \a msg and uses \a code to get a system specific - error message. When \a code is -1 (the default), the system's last - error code will be used if possible. Use this method to handle - failures in platform specific API calls. - - This function does nothing when TQt is built with \c TQT_NO_DEBUG - defined. -*/ -void tqSystemWarning( const char* msg, int code ) -{ -#ifndef TQT_NO_DEBUG -#if defined(TQ_OS_WIN32) - if ( code == -1 ) - code = GetLastError(); - - if ( !code ) - return; - - unsigned short *string; - TQT_WA( { - FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - code, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&string, - 0, - NULL ); - - qWarning( "%s\n\tError code %d - %s", msg, code, TQString::fromUcs2(string).latin1() ); - }, { - FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - code, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (char*)&string, - 0, - NULL ); - - qWarning( "%s\n\tError code %d - %s", msg, code, (const char*)string ); - } ); - LocalFree( (HLOCAL)string ); -#else - if ( code != -1 ) - qWarning( "%s\n\tError code %d - %s", msg, code, strerror( code ) ); - else - qWarning( "%s", msg ); -#endif -#else - TQ_UNUSED( msg ); - TQ_UNUSED( code ); -#endif -} - -/*! - \fn void TQ_ASSERT( bool test ) - - \relates TQApplication - - Prints a warning message containing the source code file name and - line number if \a test is FALSE. - - This is really a macro defined in \c tqglobal.h. - - TQ_ASSERT is useful for testing pre- and post-conditions. - - Example: - \code - // - // File: div.cpp - // - - #include <tqglobal.h> - - int divide( int a, int b ) - { - TQ_ASSERT( b != 0 ); // this is line 9 - return a/b; - } - \endcode - - If \c b is zero, the TQ_ASSERT statement will output the following - message using the qWarning() function: - \code - ASSERT: "b != 0" in div.cpp (9) - \endcode - - \sa qWarning(), \link debug.html Debugging\endlink -*/ - - -/*! - \fn void TQ_CHECK_PTR( void *p ) - - \relates TQApplication - - If \a p is 0, prints a warning message containing the source code file - name and line number, saying that the program ran out of memory. - - This is really a macro defined in \c tqglobal.h. - - Example: - \code - int *a; - - TQ_CHECK_PTR( a = new int[80] ); // WRONG! - - a = new (nothrow) int[80]; // Right - TQ_CHECK_PTR( a ); - \endcode - - \sa qWarning(), \link debug.html Debugging\endlink -*/ - - -// -// The TQ_CHECK_PTR macro calls this function to check if an allocation went ok. -// -#if (TQT_VERSION-0 >= 0x040000) -#if defined(TQ_CC_GNU) -#warning "Change TQ_CHECK_PTR to '{if ((p)==0) qt_check_pointer(__FILE__,__LINE__);}'" -#warning "No need for qt_check_pointer() to return a value - make it void!" -#endif -#endif -bool qt_check_pointer( bool c, const char *n, int l ) -{ - if ( c ) - qWarning( "In file %s, line %d: Out of memory", n, l ); - return TRUE; -} - - -static bool firstObsoleteWarning(const char *obj, const char *oldfunc ) -{ - static TQAsciiDict<int> *obsoleteDict = 0; - if ( !obsoleteDict ) { // first time func is called - obsoleteDict = new TQAsciiDict<int>; -#if defined(TQT_DEBUG) - qDebug( - "You are using obsolete functions in the TQt library. Call the function\n" - "tqSuppressObsoleteWarnings() to suppress obsolete warnings.\n" - ); -#endif - } - TQCString s( obj ); - s += "::"; - s += oldfunc; - if ( obsoleteDict->find(s.data()) == 0 ) { - obsoleteDict->insert( s.data(), (int*)1 ); // anything different from 0 - return TRUE; - } - return FALSE; -} - -static bool suppressObsolete = FALSE; - -void tqSuppressObsoleteWarnings( bool suppress ) -{ - suppressObsolete = suppress; -} - -void qObsolete( const char *obj, const char *oldfunc, const char *newfunc ) -{ - if ( suppressObsolete ) - return; - if ( !firstObsoleteWarning(obj, oldfunc) ) - return; - if ( obj ) - qDebug( "%s::%s: This function is obsolete, use %s instead.", - obj, oldfunc, newfunc ); - else - qDebug( "%s: This function is obsolete, use %s instead.", - oldfunc, newfunc ); -} - -void qObsolete( const char *obj, const char *oldfunc ) -{ - if ( suppressObsolete ) - return; - if ( !firstObsoleteWarning(obj, oldfunc) ) - return; - if ( obj ) - qDebug( "%s::%s: This function is obsolete.", obj, oldfunc ); - else - qDebug( "%s: This function is obsolete.", oldfunc ); -} - -void qObsolete( const char *message ) -{ - if ( suppressObsolete ) - return; - if ( !firstObsoleteWarning( "TQt", message) ) - return; - qDebug( "%s", message ); -} - - -/*! - \relates TQApplication - - Installs a TQt message handler \a h. Returns a pointer to the - message handler previously defined. - - The message handler is a function that prints out debug messages, - warnings and fatal error messages. The TQt library (debug version) - contains hundreds of warning messages that are printed when - internal errors (usually invalid function arguments) occur. If you - implement your own message handler, you get total control of these - messages. - - The default message handler prints the message to the standard - output under X11 or to the debugger under Windows. If it is a - fatal message, the application aborts immediately. - - Only one message handler can be defined, since this is usually - done on an application-wide basis to control debug output. - - To restore the message handler, call \c tqInstallMsgHandler(0). - - Example: - \code - #include <tqapplication.h> - #include <stdio.h> - #include <stdlib.h> - - void myMessageOutput( TQtMsgType type, const char *msg ) - { - switch ( type ) { - case TQtDebugMsg: - fprintf( stderr, "Debug: %s\n", msg ); - break; - case TQtWarningMsg: - fprintf( stderr, "Warning: %s\n", msg ); - break; - case TQtFatalMsg: - fprintf( stderr, "Fatal: %s\n", msg ); - abort(); // deliberately core dump - } - } - - int main( int argc, char **argv ) - { - tqInstallMsgHandler( myMessageOutput ); - TQApplication a( argc, argv ); - ... - return a.exec(); - } - \endcode - - \sa qDebug(), qWarning(), qFatal(), \link debug.html Debugging\endlink -*/ - -TQtMsgHandler tqInstallMsgHandler( TQtMsgHandler h ) -{ - TQtMsgHandler old = handler; - handler = h; - return old; -} - - -/* - Dijkstra's bisection algorithm to find the square root as an integer. - Deliberately not exported as part of the TQt API, but used in both - qsimplerichtext.cpp and qgfxraster_qws.cpp -*/ -unsigned int qt_int_sqrt( unsigned int n ) -{ - // n must be in the range 0...UINT_MAX/2-1 - if ( n >= ( UINT_MAX>>2 ) ) { - unsigned int r = 2 * qt_int_sqrt( n / 4 ); - unsigned int r2 = r + 1; - return ( n >= r2 * r2 ) ? r2 : r; - } - uint h, p= 0, q= 1, r= n; - while ( q <= n ) - q <<= 2; - while ( q != 1 ) { - q >>= 2; - h= p + q; - p >>= 1; - if ( r >= h ) { - p += q; - r -= h; - } - } - return p; -} - diff --git a/tqtinterface/qt4/src/tools/tqglobal.h b/tqtinterface/qt4/src/tools/tqglobal.h deleted file mode 100644 index 6dbb122..0000000 --- a/tqtinterface/qt4/src/tools/tqglobal.h +++ /dev/null @@ -1,1135 +0,0 @@ -/**************************************************************************** -** -** Global type declarations and definitions -** -** Created : 920529 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQGLOBAL_H -#define TQGLOBAL_H - -#define TQT_VERSION_STR "3.4.0" -/* - TQT_VERSION is (major << 16) + (minor << 8) + patch. - */ -#define TQT_VERSION 0x030400 - -/* - The operating system, must be one of: (TQ_OS_x) - - MACX - Mac OS X - MAC9 - Mac OS 9 - DARWIN - Darwin OS (Without Mac OS X) - MSDOS - MS-DOS and Windows - OS2 - OS/2 - OS2EMX - XFree86 on OS/2 (not PM) - WIN32 - Win32 (Windows 95/98/ME and Windows NT/2000/XP) - CYGWIN - Cygwin - SOLARIS - Sun Solaris - HPUX - HP-UX - ULTRIX - DEC Ultrix - LINUX - Linux - FREEBSD - FreeBSD - NETBSD - NetBSD - OPENBSD - OpenBSD - BSDI - BSD/OS - IRIX - SGI Irix - OSF - HP Tru64 UNIX - SCO - SCO OpenServer 5 - UNIXWARE - UnixWare 7, Open UNIX 8 - AIX - AIX - HURD - GNU Hurd - DGUX - DG/UX - RELIANT - Reliant UNIX - DYNIX - DYNIX/ptx - TQNX - TQNX - TQNX6 - TQNX RTP 6.1 - LYNX - LynxOS - BSD4 - Any BSD 4.4 system - UNIX - Any UNIX BSD/SYSV system -*/ - -#if defined(__DARWIN_X11__) -# define TQ_OS_DARWIN -#elif defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__)) -# define TQ_OS_MACX -#elif defined(__MACOSX__) -# define TQ_OS_MACX -#elif defined(macintosh) -# define TQ_OS_MAC9 -#elif defined(__CYGWIN__) -# define TQ_OS_CYGWIN -#elif defined(MSDOS) || defined(_MSDOS) -# define TQ_OS_MSDOS -#elif defined(__OS2__) -# if defined(__EMX__) -# define TQ_OS_OS2EMX -# else -# define TQ_OS_OS2 -# endif -#elif !defined(SAG_COM) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__)) -# define TQ_OS_WIN32 -# define TQ_OS_WIN64 -#elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)) -# define TQ_OS_WIN32 -#elif defined(__MWERKS__) && defined(__INTEL__) -# define TQ_OS_WIN32 -#elif defined(__sun) || defined(sun) -# define TQ_OS_SOLARIS -#elif defined(hpux) || defined(__hpux) -# define TQ_OS_HPUX -#elif defined(__ultrix) || defined(ultrix) -# define TQ_OS_ULTRIX -#elif defined(sinix) -# define TQ_OS_RELIANT -#elif defined(__GNU__) -# define TQ_OS_HURD -#elif defined(__linux__) || defined(__linux) || defined(__GNU__) || defined(__GLIBC__) -# define TQ_OS_LINUX -#elif defined(__FreeBSD__) || defined(__DragonFly__) -# define TQ_OS_FREEBSD -# define TQ_OS_BSD4 -#elif defined(__NetBSD__) -# define TQ_OS_NETBSD -# define TQ_OS_BSD4 -#elif defined(__OpenBSD__) -# define TQ_OS_OPENBSD -# define TQ_OS_BSD4 -#elif defined(__bsdi__) -# define TQ_OS_BSDI -# define TQ_OS_BSD4 -#elif defined(__sgi) -# define TQ_OS_IRIX -#elif defined(__osf__) -# define TQ_OS_OSF -#elif defined(_AIX) -# define TQ_OS_AIX -#elif defined(__Lynx__) -# define TQ_OS_LYNX -#elif defined(__DGUX__) -# define TQ_OS_DGUX -#elif defined(__TQNXNTO__) -# define TQ_OS_TQNX6 -#elif defined(__TQNX__) -# define TQ_OS_TQNX -#elif defined(_SETQUENT_) -# define TQ_OS_DYNIX -#elif defined(_SCO_DS) /* SCO OpenServer 5 + GCC */ -# define TQ_OS_SCO -#elif defined(__USLC__) /* all SCO platforms + UDK or OUDK */ -# define TQ_OS_UNIXWARE -# define TQ_OS_UNIXWARE7 -#elif defined(__svr4__) && defined(i386) /* Open UNIX 8 + GCC */ -# define TQ_OS_UNIXWARE -# define TQ_OS_UNIXWARE7 -#elif defined(__MAKEDEPEND__) -#else -# error "TQt has not been ported to this OS - talk to qt-bugs@trolltech.com" -#endif - -#if defined(TQ_OS_WIN32) || defined(TQ_OS_WIN64) -# define TQ_OS_WIN -#endif - -#if defined(TQ_OS_MAC9) || defined(TQ_OS_MACX) -# define TQ_OS_MAC -#endif - -#if defined(TQ_OS_MAC9) || defined(TQ_OS_MSDOS) || defined(TQ_OS_OS2) || defined(TQ_OS_WIN) -# undef TQ_OS_UNIX -#elif !defined(TQ_OS_UNIX) -# define TQ_OS_UNIX -#endif - -#if defined(TQ_OS_MACX) -# ifdef MAC_OS_X_VERSION_MIN_RETQUIRED -# undef MAC_OS_X_VERSION_MIN_RETQUIRED -# endif -# define MAC_OS_X_VERSION_MIN_RETQUIRED MAC_OS_X_VERSION_10_2 -# include <AvailabilityMacros.h> -# if !defined(MAC_OS_X_VERSION_10_3) -# define MAC_OS_X_VERSION_10_3 MAC_OS_X_VERSION_10_2 + 1 -# endif -# if !defined(MAC_OS_X_VERSION_10_4) -# define MAC_OS_X_VERSION_10_4 MAC_OS_X_VERSION_10_3 + 1 -# endif -# if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_4) -# error "This version of Mac OS X is unsupported" -# endif -#endif - - -/* - The compiler, must be one of: (TQ_CC_x) - - SYM - Symantec C++ for both PC and Macintosh - MPW - MPW C++ - MWERKS - Metrowerks CodeWarrior - MSVC - Microsoft Visual C/C++, Intel C++ for Windows - BOR - Borland/Turbo C++ - WAT - Watcom C++ - GNU - GNU C++ - COMEAU - Comeau C++ - EDG - Edison Design Group C++ - OC - CenterLine C++ - SUN - Sun WorkShop, Forte Developer, or Sun ONE Studio C++ - MIPS - MIPSpro C++ - DEC - DEC C++ - HP - HPUX C++ - HPACC - HPUX ANSI C++ - USLC - SCO OUDK, UDK, and UnixWare 2.X C++ - CDS - Reliant C++ - KAI - KAI C++ - INTEL - Intel C++ for Linux, Intel C++ for Windows - HIGHC - MetaWare High C/C++ - PGI - Portland Group C++ - GHS - Green Hills Optimizing C++ Compilers - - Should be sorted most to least authoritative. -*/ - -/* Symantec C++ is now Digital Mars */ -#if defined(__DMC__) || defined(__SC__) -# define TQ_CC_SYM -/* "explicit" semantics implemented in 8.1e but keyword recognized since 7.5 */ -# if defined(__SC__) && __SC__ < 0x750 -# define TQ_NO_EXPLICIT_KEYWORD -# endif -# define TQ_NO_USING_KEYWORD -# if !defined(_CPPUNWIND) -# define TQ_NO_EXCEPTIONS -# endif - -#elif defined(applec) -# define TQ_CC_MPW -# define TQ_NO_BOOL_TYPE -# define TQ_NO_EXPLICIT_KEYWORD -# define TQ_NO_USING_KEYWORD - -#elif defined(__MWERKS__) -# define TQ_CC_MWERKS -/* "explicit" recognized since 4.0d1 */ -# define TQMAC_PASCAL pascal - -#elif defined(_MSC_VER) -# define TQ_CC_MSVC -/* proper support of bool for _MSC_VER >= 1100 */ -# define TQ_CANNOT_DELETE_CONSTANT -# define TQ_INLINE_TEMPLATES inline -/* Visual C++.Net issues for _MSC_VER >= 1300 */ -# if _MSC_VER >= 1300 -# define TQ_CC_MSVC_NET -# if _MSC_VER < 1310 || (defined(TQ_OS_WIN64) && defined(_M_IA64)) -# define TQ_TYPENAME -# endif -# endif -/* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */ -# if defined(__INTEL_COMPILER) -# define TQ_CC_INTEL -# if !defined(__EXCEPTIONS) -# define TQ_NO_EXCEPTIONS -# endif -# else -# define TQ_NO_USING_KEYWORD /* ### check "using" status */ -# endif - -#elif defined(__BORLANDC__) || defined(__TURBOC__) -# define TQ_CC_BOR -# if __BORLANDC__ < 0x502 -# define TQ_NO_BOOL_TYPE -# define TQ_NO_EXPLICIT_KEYWORD -# endif -# define TQ_NO_USING_KEYWORD /* ### check "using" status */ - -#elif defined(__WATCOMC__) -# define TQ_CC_WAT -# if defined(TQ_OS_TQNX4) -/* compiler flags */ -# define TQ_TYPENAME -# define TQ_NO_BOOL_TYPE -# define TQ_CANNOT_DELETE_CONSTANT -# define mutable -/* ??? */ -# define TQ_BROKEN_TEMPLATE_SPECIALIZATION -/* no template classes in TQVariant */ -# define TQT_NO_TEMPLATE_VARIANT -/* Wcc does not fill in functions needed by valuelists, maps, and - valuestacks implicitly */ -# define TQ_FULL_TEMPLATE_INSTANTIATION -/* can we just compare the structures? */ -# define TQ_FULL_TEMPLATE_INSTANTIATION_MEMCMP -/* these are not useful to our customers */ -# define TQT_TQWS_NO_SHM -# define TQT_NO_TQWS_MULTIPROCESS -# define TQT_NO_SQL -# define TQT_NO_TQWS_CURSOR -# endif - -#elif defined(__GNUC__) -# define TQ_CC_GNU -# define TQ_C_CALLBACKS -# if __GNUC__ == 2 && __GNUC_MINOR__ <= 7 -# define TQ_FULL_TEMPLATE_INSTANTIATION -# endif -/* GCC 2.95 knows "using" but does not support it correctly */ -# if __GNUC__ == 2 && __GNUC_MINOR__ <= 95 -# define TQ_NO_USING_KEYWORD -# endif -/* GCC 3.1 and GCC 3.2 wrongly define _SB_CTYPE_MACROS on HP-UX */ -# if defined(TQ_OS_HPUX) && __GNUC__ == 3 && __GNUC_MINOR__ >= 1 -# define TQ_WRONG_SB_CTYPE_MACROS -# endif - -/* ARM gcc pads structs to 32 bits, even when they contain a single - char, or short. We tell gcc to pack TQChars to 16 bits, to avoid - TQString bloat. However, gcc 3.4 doesn't allow us to create references to - members of a packed struct. (Pointers are OK, because then you - supposedly know what you are doing.) */ -# if (defined(__arm__) || defined(__ARMEL__)) && !defined(__ARM_EABI__) && !defined(TQT_TQMOC_CPP) -# define TQ_PACKED __attribute__ ((packed)) -# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 -# define TQ_NO_PACKED_REFERENCE -# endif -# endif -# if !defined(__EXCEPTIONS) -# define TQ_NO_EXCEPTIONS -# endif - -/* IBM compiler versions are a bit messy. There are actually two products: - the C product, and the C++ product. The C++ compiler is always packaged - with the latest version of the C compiler. Version numbers do not always - match. This little table (I'm not sure it's accurate) should be helpful: - - C++ product C product - - C Set 3.1 C Compiler 3.0 - ... ... - C++ Compiler 3.6.6 C Compiler 4.3 - ... ... - Visual Age C++ 4.0 ... - ... ... - Visual Age C++ 5.0 C Compiler 5.0 - ... ... - Visual Age C++ 6.0 C Compiler 6.0 - - Now: - __xlC__ is the version of the C compiler in hexadecimal notation - is only an approximation of the C++ compiler version - __IBMCPP__ is the version of the C++ compiler in decimal notation - but it is not defined on older compilers like C Set 3.1 */ -#elif defined(__xlC__) -# define TQ_CC_XLC -# define TQ_FULL_TEMPLATE_INSTANTIATION -# if __xlC__ < 0x400 -# define TQ_NO_BOOL_TYPE -# define TQ_NO_EXPLICIT_KEYWORD -# define TQ_NO_USING_KEYWORD -# define TQ_TYPENAME -# define TQ_INLINE_TEMPLATES inline -# define TQ_BROKEN_TEMPLATE_SPECIALIZATION -# define TQ_CANNOT_DELETE_CONSTANT -# endif - -/* Older versions of DEC C++ do not define __EDG__ or __EDG - observed - on DEC C++ V5.5-004. New versions do define __EDG__ - observed on - Compaq C++ V6.3-002. - This compiler is different enough from other EDG compilers to handle - it separately anyway. */ -#elif defined(__DECCXX) || defined(__DECC) -# define TQ_CC_DEC -/* Compaq C++ V6 compilers are EDG-based but I'm not sure about older - DEC C++ V5 compilers. */ -# if defined(__EDG__) -# define TQ_CC_EDG -# endif -/* Compaq have disabled EDG's _BOOL macro and use _BOOL_EXISTS instead - - observed on Compaq C++ V6.3-002. - In any case versions prior to Compaq C++ V6.0-005 do not have bool. */ -# if !defined(_BOOL_EXISTS) -# define TQ_NO_BOOL_TYPE -# endif -/* Spurious (?) error messages observed on Compaq C++ V6.5-014. */ -# define TQ_NO_USING_KEYWORD -/* Apply to all versions prior to Compaq C++ V6.0-000 - observed on - DEC C++ V5.5-004. */ -# if __DECCXX_VER < 60060000 -# define TQ_TYPENAME -# define TQ_BROKEN_TEMPLATE_SPECIALIZATION -# define TQ_CANNOT_DELETE_CONSTANT -# endif -/* avoid undefined symbol problems with out-of-line template members */ -# define TQ_INLINE_TEMPLATES inline - -/* Compilers with EDG front end are similar. To detect them we test: - __EDG documented by SGI, observed on MIPSpro 7.3.1.1 and KAI C++ 4.0b - __EDG__ documented in EDG online docs, observed on Compaq C++ V6.3-002 */ -#elif defined(__EDG) || defined(__EDG__) -# define TQ_CC_EDG -/* From the EDG documentation (does not seem to apply to Compaq C++): - _BOOL - Defined in C++ mode when bool is a keyword. The name of this - predefined macro is specified by a configuration flag. _BOOL - is the default. - __BOOL_DEFINED - Defined in Microsoft C++ mode when bool is a keyword. */ -# if !defined(_BOOL) && !defined(__BOOL_DEFINED) -# define TQ_NO_BOOL_TYPE -# endif - -/* The Comeau compiler is based on EDG and does define __EDG__ */ -# if defined(__COMO__) -# define TQ_CC_COMEAU -# define TQ_C_CALLBACKS - -/* The `using' keyword was introduced to avoid KAI C++ warnings - but it's now causing KAI C++ errors instead. The standard is - unclear about the use of this keyword, and in practice every - compiler is using its own set of rules. Forget it. */ -# elif defined(__KCC) -# define TQ_CC_KAI -# if !defined(_EXCEPTIONS) -# define TQ_NO_EXCEPTIONS -# endif -# define TQ_NO_USING_KEYWORD - -/* Using the `using' keyword avoids Intel C++ for Linux warnings */ -# elif defined(__INTEL_COMPILER) -# define TQ_CC_INTEL -# if !defined(__EXCEPTIONS) -# define TQ_NO_EXCEPTIONS -# endif - -/* The Portland Group compiler is based on EDG and does define __EDG__ */ -# elif defined(__PGI) -# define TQ_CC_PGI -# if !defined(__EXCEPTIONS) -# define TQ_NO_EXCEPTIONS -# endif - -/* Never tested! */ -# elif defined(__ghs) -# define TQ_CC_GHS - -/* The UnixWare 7 UDK compiler is based on EDG and does define __EDG__ */ -# elif defined(__USLC__) && defined(__SCO_VERSION__) -# define TQ_CC_USLC -/* The latest UDK 7.1.1b does not need this, but previous versions do */ -# if !defined(__SCO_VERSION__) || (__SCO_VERSION__ < 302200010) -# define TQ_INLINE_TEMPLATES inline -# endif -# define TQ_NO_USING_KEYWORD /* ### check "using" status */ - -/* Never tested! */ -# elif defined(CENTERLINE_CLPP) || defined(OBJECTCENTER) -# define TQ_CC_OC -# define TQ_NO_USING_KEYWORD - -/* CDS++ defines __EDG__ although this is not documented in the Reliant - documentation. It also follows conventions like _BOOL and this documented */ -# elif defined(sinix) -# define TQ_CC_CDS -# define TQ_NO_USING_KEYWORD -# if defined(__cplusplus) && (__cplusplus < 2) /* Cfront C++ mode */ -# define TQ_NO_EXCEPTIONS -# endif - -/* The MIPSpro compiler in o32 mode is based on EDG but disables features - such as template specialization nevertheless */ -# elif defined(__sgi) -# define TQ_CC_MIPS -# if defined(_MIPS_SIM) && (_MIPS_SIM == _ABIO32) /* o32 ABI */ -# define TQ_TYPENAME -# define TQ_BROKEN_TEMPLATE_SPECIALIZATION -# define TQ_NO_EXPLICIT_KEYWORD -# define TQ_INLINE_TEMPLATES inline -# elif defined(_COMPILER_VERSION) && (_COMPILER_VERSION < 730) /* 7.2 */ -# define TQ_TYPENAME -# define TQ_BROKEN_TEMPLATE_SPECIALIZATION -# endif -# define TQ_NO_USING_KEYWORD /* ### check "using" status */ -# if defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 740) -# pragma set woff 3624,3625, 3649 /* turn off some harmless warnings */ -# endif -# endif - -/* The older UnixWare 2.X compiler? */ -#elif defined(__USLC__) -# define TQ_CC_USLC -# define TQ_TYPENAME -# define TQ_NO_BOOL_TYPE -# define TQ_NO_EXPLICIT_KEYWORD -# define TQ_NO_USING_KEYWORD -# define TQ_INLINE_TEMPLATES inline - -/* Never tested! */ -#elif defined(__HIGHC__) -# define TQ_CC_HIGHC - -#elif defined(__SUNPRO_CC) || defined(__SUNPRO_C) -# define TQ_CC_SUN -/* 5.0 compiler or better - 'bool' is enabled by default but can be disabled using -features=nobool - in which case _BOOL is not defined - this is the default in 4.2 compatibility mode triggered by -compat=4 */ -# if __SUNPRO_CC >= 0x500 -# if !defined(_BOOL) -# define TQ_NO_BOOL_TYPE -# endif -# if defined(__SUNPRO_CC_COMPAT) && (__SUNPRO_CC_COMPAT <= 4) -# define TQ_NO_USING_KEYWORD -# endif -# define TQ_C_CALLBACKS -/* 4.2 compiler or older */ -# else -# define TQ_NO_BOOL_TYPE -# define TQ_NO_EXPLICIT_KEYWORD -# define TQ_NO_USING_KEYWORD -# endif - -/* CDS++ does not seem to define __EDG__ or __EDG according to Reliant - documentation but nevertheless uses EDG conventions like _BOOL */ -#elif defined(sinix) -# define TQ_CC_EDG -# define TQ_CC_CDS -# if !defined(_BOOL) -# define TQ_NO_BOOL_TYPE -# endif -# define TQ_BROKEN_TEMPLATE_SPECIALIZATION - -#elif defined(TQ_OS_HPUX) -/* __HP_aCC was not defined in first aCC releases */ -# if defined(__HP_aCC) || __cplusplus >= 199707L -# define TQ_CC_HPACC -# else -# define TQ_CC_HP -# define TQ_NO_BOOL_TYPE -# define TQ_FULL_TEMPLATE_INSTANTIATION -# define TQ_BROKEN_TEMPLATE_SPECIALIZATION -# define TQ_NO_EXPLICIT_KEYWORD -# endif -# define TQ_NO_USING_KEYWORD /* ### check "using" status */ - -#else -# error "TQt has not been tested with this compiler - talk to qt-bugs@trolltech.com" -#endif - -#ifndef TQ_PACKED -# define TQ_PACKED -#endif - - -/* - The window system, must be one of: (TQ_WS_x) - - MACX - Mac OS X - MAC9 - Mac OS 9 - TQWS - TQt/Embedded - WIN32 - Windows - X11 - X Window System - PM - unsupported - WIN16 - unsupported -*/ - -#if defined(TQ_OS_MAC9) -# define TQ_WS_MAC9 -#elif defined(TQ_OS_MSDOS) -# define TQ_WS_WIN16 -# error "TQt requires Win32 and does not work with Windows 3.x" -#elif defined(_WIN32_X11_) -# define TQ_WS_X11 -#elif defined(TQ_OS_WIN32) -# define TQ_WS_WIN32 -# if defined(TQ_OS_WIN64) -# define TQ_WS_WIN64 -# endif -#elif defined(TQ_OS_OS2) -# define TQ_WS_PM -# error "TQt does not work with OS/2 Presentation Manager or Workplace Shell" -#elif defined(TQ_OS_UNIX) -# if defined(TQWS) -# define TQ_WS_TQWS -# define TQT_NO_TQWS_IM -# elif defined(TQ_OS_MACX) -# define TQ_WS_MACX -# else -# define TQ_WS_X11 -# endif -#endif -#if defined(TQ_OS_MAC) && !defined(TQMAC_PASCAL) -# define TQMAC_PASCAL -#endif - -#if defined(TQ_WS_WIN16) || defined(TQ_WS_WIN32) -# define TQ_WS_WIN -#endif - -#if (defined(TQ_WS_MAC9) || defined(TQ_WS_MACX)) && !defined(TQ_WS_TQWS) && !defined(TQ_WS_X11) -# define TQ_WS_MAC -#endif - - -/* - Some classes do not permit copies to be made of an object. - These classes contains a private copy constructor and operator= - to disable copying (the compiler gives an error message). - Undefine TQ_DISABLE_COPY to turn off this checking. -*/ - -#define TQ_DISABLE_COPY - -#if defined(__cplusplus) - - -// -// Useful type definitions for TQt -// - -#if defined(TQ_NO_BOOL_TYPE) -#if defined(TQ_CC_HP) -// bool is an unsupported reserved keyword in later versions -#define bool int -#else -typedef int bool; -#endif -#endif - -typedef unsigned char uchar; -typedef unsigned short ushort; -typedef unsigned uint; -typedef unsigned long ulong; -typedef char *pchar; -typedef uchar *puchar; -typedef const char *pcchar; - - -// -// Constant bool values -// - -#ifndef TRUE -const bool FALSE = 0; -const bool TRUE = !0; -#endif -#if defined(__WATCOMC__) -# if defined(TQ_OS_TQNX4) -const bool false = FALSE; -const bool true = TRUE; -# endif -#endif - -// -// Proper for-scoping -// ### turn on in 4.0 - -#if 0 && defined(TQ_CC_MSVC) && !defined(TQ_CC_MSVC_NET) -# define for if(0){}else for -#endif - -// -// Use the "explicit" keyword on platforms that support it. -// - -#if !defined(TQ_NO_EXPLICIT_KEYWORD) -# define TQ_EXPLICIT explicit -#else -# define TQ_EXPLICIT -#endif - - -// -// Workaround for static const members on MSVC++. -// - -#if defined(TQ_CC_MSVC) -# define TQT_STATIC_CONST static -# define TQT_STATIC_CONST_IMPL -#else -# define TQT_STATIC_CONST static const -# define TQT_STATIC_CONST_IMPL const -#endif - - -// -// Utility macros and inline functions -// - -#define TQMAX(a, b) ((b) < (a) ? (a) : (b)) -#define TQMIN(a, b) ((a) < (b) ? (a) : (b)) -#define TQABS(a) ((a) >= 0 ? (a) : -(a)) - -inline int tqRound( double d ) -{ - return d >= 0.0 ? int(d + 0.5) : int( d - ((int)d-1) + 0.5 ) + ((int)d-1); -} - - -// -// Size-dependent types (architechture-dependent byte order) -// - -#if !defined(TQT_CLEAN_NAMESPACE) -// source compatibility with TQt 1.x -typedef signed char INT8; // 8 bit signed -typedef unsigned char UINT8; // 8 bit unsigned -typedef short INT16; // 16 bit signed -typedef unsigned short UINT16; // 16 bit unsigned -// typedef int INT32; // 32 bit signed // [FIXME] Conflicts with Xorg headers -typedef unsigned int UINT32; // 32 bit unsigned -#endif - -typedef signed char TQ_INT8; // 8 bit signed -typedef unsigned char TQ_UINT8; // 8 bit unsigned -typedef short TQ_INT16; // 16 bit signed -typedef unsigned short TQ_UINT16; // 16 bit unsigned -typedef int TQ_INT32; // 32 bit signed -typedef unsigned int TQ_UINT32; // 32 bit unsigned -#if defined(TQ_OS_WIN64) -typedef __int64 TQ_LONG; // word up to 64 bit signed -typedef unsigned __int64 TQ_ULONG; // word up to 64 bit unsigned -#else -typedef long TQ_LONG; // word up to 64 bit signed -typedef unsigned long TQ_ULONG; // word up to 64 bit unsigned -#endif -#if defined(TQ_OS_WIN) && !defined(TQ_CC_GNU) -# define TQ_INT64_C(c) c ## i64 // signed 64 bit constant -# define TQ_UINT64_C(c) c ## ui64 // unsigned 64 bit constant -typedef __int64 TQ_INT64; // 64 bit signed -typedef unsigned __int64 TQ_UINT64; // 64 bit unsigned -#else -# define TQ_INT64_C(c) c ## LL // signed 64 bit constant -# define TQ_UINT64_C(c) c ## ULL // unsigned 64 bit constant -typedef long long TQ_INT64; // 64 bit signed -typedef unsigned long long TQ_UINT64; // 64 bit unsigned -#endif -typedef TQ_INT64 TQ_LLONG; // signed long long -typedef TQ_UINT64 TQ_ULLONG; // unsigned long long - -#if defined(TQ_OS_MACX) && !defined(TQT_LARGEFILE_SUPPORT) -# define TQT_LARGEFILE_SUPPORT 64 -#endif -#if defined(TQT_LARGEFILE_SUPPORT) - typedef TQ_ULLONG TQtOffset; -#else - typedef TQ_ULONG TQtOffset; -#endif - - -// -// Data stream functions is provided by many classes (defined in tqdatastream.h) -// - -class TQDataStream; - - -// -// Feature subsetting -// -// Note that disabling some features will produce a libtqt that is not -// compatible with other libtqt builds. Such modifications are only -// supported on TQt/Embedded where reducing the library size is important -// and where the application-suite is often a fixed set. -// - -#if !defined(TQT_TQMOC) -#if defined(TQCONFIG_LOCAL) -#include "tqconfig-local.h" -#elif defined(TQCONFIG_MINIMAL) -#include "tqconfig-minimal.h" -#elif defined(TQCONFIG_SMALL) -#include "tqconfig-small.h" -#elif defined(TQCONFIG_MEDIUM) -#include "tqconfig-medium.h" -#elif defined(TQCONFIG_LARGE) -#include "tqconfig-large.h" -#else // everything... -#include "tqconfig.h" -#endif -#endif - - -#ifndef TQT_BUILD_KEY -#define TQT_BUILD_KEY "unspecified" -#endif - -// prune to local config -#include "tqmodules.h" -#ifndef TQT_MODULE_DIALOGS -# define TQT_NO_DIALOG -#endif -#ifndef TQT_MODULE_ICONVIEW -# define TQT_NO_ICONVIEW -#endif -#ifndef TQT_MODULE_WORKSPACE -# define TQT_NO_WORKSPACE -#endif -#ifndef TQT_MODULE_NETWORK -#define TQT_NO_NETWORK -#endif -#ifndef TQT_MODULE_CANVAS -# define TQT_NO_CANVAS -#endif -#ifndef TQT_MODULE_TABLE -#define TQT_NO_TABLE -#endif -#ifndef TQT_MODULE_XML -# define TQT_NO_XML -#endif -#ifndef TQT_MODULE_OPENGL -# define TQT_NO_OPENGL -#endif -#if !defined(TQT_MODULE_SQL) -# define TQT_NO_SQL -#endif - -#if defined(TQ_WS_MAC9) -//No need for menu merging -# ifndef TQMAC_TQMENUBAR_NO_MERGE -# define TQMAC_TQMENUBAR_NO_MERGE -# endif -//Mac9 does not use quartz -# ifndef TQMAC_NO_TQUARTZ -# define TQMAC_NO_TQUARTZ -# endif -# ifndef TQMAC_TQMENUBAR_NO_EVENT -# define TQMAC_TQMENUBAR_NO_EVENT -# endif -#endif -#if defined(TQ_WS_MACX) //for no nobody uses quartz, just putting in first level hooks -# ifndef TQMAC_NO_TQUARTZ -# define TQMAC_NO_TQUARTZ -# endif -# ifndef TQMAC_TQMENUBAR_NO_EVENT -# define TQMAC_TQMENUBAR_NO_EVENT -# endif -#endif - -#if !defined(TQ_WS_TQWS) && !defined(TQT_NO_COP) -# define TQT_NO_COP -#endif - -#ifndef TQT_H -#include "tqfeatures.h" -#endif /* TQT_H */ - - -// -// Create TQt DLL if TQT_DLL is defined (Windows only) -// or TQT_SHARED is defined (Kylix only) -// - -#if defined(TQ_OS_WIN) -# if defined(TQT_NODLL) -# undef TQT_MAKEDLL -# undef TQT_DLL -# elif defined(TQT_MAKEDLL) /* create a TQt DLL library */ -# if defined(TQT_DLL) -# undef TQT_DLL -# endif -# define TQ_EXPORT __declspec(dllexport) -# define TQ_TEMPLATEDLL -# define TQ_TEMPLATE_EXTERN -# undef TQ_DISABLE_COPY /* avoid unresolved externals */ -# elif defined(TQT_DLL) /* use a TQt DLL library */ -# define TQ_EXPORT __declspec(dllimport) -# define TQ_TEMPLATEDLL -# ifndef TQ_TEMPLATE_EXTERN -# if defined(TQ_CC_MSVC_NET) -# define TQ_TEMPLATE_EXTERN extern -# else -# define TQ_TEMPLATE_EXTERN -# endif -# endif -# undef TQ_DISABLE_COPY /* avoid unresolved externals */ -# endif -#elif defined(TQ_OS_LINUX) && defined(TQ_CC_BOR) -# if defined(TQT_SHARED) /* create a TQt shared library */ -# define TQ_EXPORT __declspec(dllexport) -# define TQ_TEMPLATEDLL -# define TQ_TEMPLATE_EXTERN -# undef TQ_DISABLE_COPY /* avoid unresolved externals */ -# else -# define TQ_TEMPLATEDLL -# define TQ_TEMPLATE_EXTERN -# undef TQ_DISABLE_COPY /* avoid unresolved externals */ -# endif -#else -# undef TQT_MAKEDLL /* ignore these for other platforms */ -# undef TQT_DLL -#endif - -#ifndef TQ_EXPORT -# define TQ_EXPORT -#endif - - -// -// Some platform specific stuff -// - -#if defined(TQ_WS_WIN) -extern TQ_EXPORT bool qt_wintqunicode; -#endif - - -// -// System information -// - -TQ_EXPORT const char *qVersion(); -TQ_EXPORT bool qSysInfo( int *wordSize, bool *bigEndian ); -TQ_EXPORT bool qSharedBuild(); -#if defined(TQ_OS_MAC) -int qMacVersion(); -#elif defined(TQ_WS_WIN) -TQ_EXPORT int qWinVersion(); -#if defined(UNICODE) -#define TQT_WA( uni, ansi ) if ( qt_wintqunicode ) { uni } else { ansi } -#define TQT_WA_INLINE( uni, ansi ) ( qt_wintqunicode ? uni : ansi ) -#else -#define TQT_WA( uni, ansi ) ansi -#define TQT_WA_INLINE( uni, ansi ) ansi -#endif -#endif - -#ifdef TQ_OS_TEMP -#ifdef TQT_WA -#undef TQT_WA -#undef TQT_WA_INLINE -#endif -#define TQT_WA( uni, ansi ) uni -#define TQT_WA_INLINE( uni, ansi ) ( uni ) -#endif - -#ifndef TQ_INLINE_TEMPLATES -# define TQ_INLINE_TEMPLATES -#endif - -#ifndef TQ_TYPENAME -# define TQ_TYPENAME typename -#endif - -// -// Use to avoid "unused parameter" warnings -// -#define TQ_UNUSED(x) (void)x; - -// -// Debugging and error handling -// - -#if !defined(TQT_NO_CHECK) -# define TQT_CHECK_STATE // check state of objects etc. -# define TQT_CHECK_RANGE // check range of indexes etc. -# define TQT_CHECK_NULL // check null pointers -# define TQT_CHECK_MATH // check math functions -#endif - -#if !defined(TQT_NO_DEBUG) && !defined(TQT_DEBUG) -# define TQT_DEBUG // display debug messages -# if !defined(TQT_NO_COMPAT) // compatibility with TQt 2 -# if !defined(NO_DEBUG) && !defined(DEBUG) -# if !defined(TQ_OS_MACX) // clash with MacOS X headers -# define DEBUG -# endif -# endif -# endif -#endif - - -TQ_EXPORT void qDebug( const char *, ... ) // print debug message -#if defined(TQ_CC_GNU) && !defined(__INSURE__) - __attribute__ ((format (printf, 1, 2))) -#endif -; - -TQ_EXPORT void qWarning( const char *, ... ) // print warning message -#if defined(TQ_CC_GNU) && !defined(__INSURE__) - __attribute__ ((format (printf, 1, 2))) -#endif -; - -TQ_EXPORT void qFatal( const char *, ... ) // print fatal message and exit -#if defined(TQ_CC_GNU) - __attribute__ ((format (printf, 1, 2))) -#endif -; - -TQ_EXPORT void tqSystemWarning( const char *, int code = -1 ); - -#if !defined(TQT_CLEAN_NAMESPACE) // compatibility with TQt 1 - -TQ_EXPORT void debug( const char *, ... ) // print debug message -#if defined(TQ_CC_GNU) && !defined(__INSURE__) - __attribute__ ((format (printf, 1, 2))) -#endif -; - -TQ_EXPORT void warning( const char *, ... ) // print warning message -#if defined(TQ_CC_GNU) && !defined(__INSURE__) - __attribute__ ((format (printf, 1, 2))) -#endif -; - -TQ_EXPORT void fatal( const char *, ... ) // print fatal message and exit -#if defined(TQ_CC_GNU) && !defined(__INSURE__) - __attribute__ ((format (printf, 1, 2))) -#endif -; - -#endif // TQT_CLEAN_NAMESPACE - - -#if !defined(TQ_ASSERT) -# if defined(TQT_CHECK_STATE) -# if defined(TQT_FATAL_ASSERT) -# define TQ_ASSERT(x) ((x) ? (void)0 : qFatal("ASSERT: \"%s\" in %s (%d)",#x,__FILE__,__LINE__)) -# else -# define TQ_ASSERT(x) ((x) ? (void)0 : qWarning("ASSERT: \"%s\" in %s (%d)",#x,__FILE__,__LINE__)) -# endif -# else -# define TQ_ASSERT(x) -# endif -#endif - -#if !defined(TQT_NO_COMPAT) // compatibility with TQt 2 -# if !defined(ASSERT) -# if !defined(TQ_OS_TEMP) -# define ASSERT(x) TQ_ASSERT(x) -# endif -# endif -#endif // TQT_NO_COMPAT - - -TQ_EXPORT bool qt_check_pointer( bool c, const char *, int ); - -#if defined(TQT_CHECK_NULL) -# define TQ_CHECK_PTR(p) (qt_check_pointer((p)==0,__FILE__,__LINE__)) -#else -# define TQ_CHECK_PTR(p) -#endif - -#if !defined(TQT_NO_COMPAT) // compatibility with TQt 2 -# if !defined(CHECK_PTR) -# define CHECK_PTR(x) TQ_CHECK_PTR(x) -# endif -#endif // TQT_NO_COMPAT - -enum TQtMsgType { TQtDebugMsg, TQtWarningMsg, TQtFatalMsg }; - -typedef void (*TQtMsgHandler)(TQtMsgType, const char *); -TQ_EXPORT TQtMsgHandler tqInstallMsgHandler( TQtMsgHandler ); - -#if !defined(TQT_NO_COMPAT) // compatibility with TQt 2 -typedef TQtMsgHandler msg_handler; -#endif // TQT_NO_COMPAT - -TQ_EXPORT void tqSuppressObsoleteWarnings( bool = TRUE ); - -TQ_EXPORT void qObsolete( const char *obj, const char *oldfunc, - const char *newfunc ); -TQ_EXPORT void qObsolete( const char *obj, const char *oldfunc ); -TQ_EXPORT void qObsolete( const char *message ); - - -// -// Install paths from configure -// - -TQ_EXPORT const char *qInstallPath(); -TQ_EXPORT const char *qInstallPathDocs(); -TQ_EXPORT const char *qInstallPathHeaders(); -TQ_EXPORT const char *qInstallPathLibs(); -TQ_EXPORT const char *qInstallPathBins(); -TQ_EXPORT const char *qInstallPathPlugins(); -TQ_EXPORT const char *qInstallPathData(); -TQ_EXPORT const char *qInstallPathTranslations(); -TQ_EXPORT const char *qInstallPathSysconf(); - -#endif /* __cplusplus */ - -/* - compilers which follow outdated template instantiation rules - require a class to have a comparison operator to exist when - a TQValueList of this type is instantiated. It's not actually - used in the list, though. Hence the dummy implementation. - Just in case other code relies on it we better trigger a warning - mandating a real implementation. -*/ -#ifdef TQ_FULL_TEMPLATE_INSTANTIATION -# define TQ_DUMMY_COMPARISON_OPERATOR(C) \ - bool operator==( const C& ) const { \ - qWarning( #C"::operator==( const "#C"& ) got called." ); \ - return FALSE; \ - } -#else -# define TQ_DUMMY_COMPARISON_OPERATOR(C) -#endif - -#endif /* TQGLOBAL_H */ - -/* - Avoid some particularly useless warnings from some stupid compilers. - To get ALL C++ compiler warnings, define TQT_CC_WARNINGS or comment out - the line "#define TQT_NO_WARNINGS" -*/ - -#if !defined(TQT_CC_WARNINGS) -# define TQT_NO_WARNINGS -#endif -#if defined(TQT_NO_WARNINGS) -# if defined(TQ_CC_MSVC) -# pragma warning(disable: 4244) // 'conversion' conversion from 'type1' to 'type2', possible loss of data -# pragma warning(disable: 4275) // non - DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier' -# pragma warning(disable: 4514) // unreferenced inline/local function has been removed -# pragma warning(disable: 4800) // 'type' : forcing value to bool 'true' or 'false' (performance warning) -# pragma warning(disable: 4097) // typedef-name 'identifier1' used as synonym for class-name 'identifier2' -# pragma warning(disable: 4706) // assignment within conditional expression -# pragma warning(disable: 4786) // truncating debug info after 255 characters -# pragma warning(disable: 4660) // template-class specialization 'identifier' is already instantiated -# pragma warning(disable: 4355) // 'this' : used in base member initializer list -# pragma warning(disable: 4231) // nonstandard extension used : 'extern' before template explicit instantiation -# pragma warning(disable: 4710) // function not inlined -# elif defined(TQ_CC_BOR) -# pragma option -w-inl -# pragma option -w-aus -# pragma warn -inl -# pragma warn -pia -# pragma warn -ccc -# pragma warn -rch -# pragma warn -sig -# endif -#endif - diff --git a/tqtinterface/qt4/src/tools/tqgpluginmanager.cpp b/tqtinterface/qt4/src/tools/tqgpluginmanager.cpp deleted file mode 100644 index 969d424..0000000 --- a/tqtinterface/qt4/src/tools/tqgpluginmanager.cpp +++ /dev/null @@ -1,550 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQGPluginManager class -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqgpluginmanager_p.h" -#ifndef TQT_NO_COMPONENT -#include "tqcomlibrary_p.h" -#include "tqmap.h" -#include "tqdir.h" - -/* - The following co-occurrence code is borrowed from TQt Linguist. - - How similar are two texts? The approach used here relies on - co-occurrence matrices and is very efficient. - - Let's see with an example: how similar are "here" and "hither"? The - co-occurrence matrix M for "here" is M[h,e] = 1, M[e,r] = 1, - M[r,e] = 1 and 0 elsewhere; the matrix N for "hither" is N[h,i] = 1, - N[i,t] = 1, ..., N[h,e] = 1, N[e,r] = 1 and 0 elsewhere. The union - U of both matrices is the matrix U[i,j] = max { M[i,j], N[i,j] }, - and the intersection V is V[i,j] = min { M[i,j], N[i,j] }. The score - for a pair of texts is - - score = (sum of V[i,j] over all i, j) / (sum of U[i,j] over all i, j), - - a formula suggested by Arnt Gulbrandsen. Here we have - - score = 2 / 6, - - or one third. - - The implementation differs from this in a few details. Most - importantly, repetitions are ignored; for input "xxx", M[x,x] equals - 1, not 2. -*/ - -/* - Every character is assigned to one of 20 buckets so that the - co-occurrence matrix requires only 20 * 20 = 400 bits, not - 256 * 256 = 65536 bits or even more if we want the whole Unicode. - Which character falls in which bucket is arbitrary. - - The second half of the table is a replica of the first half, because of - laziness. -*/ -static const char indexOf[256] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// ! " # $ % & ' ( ) * + , - . / - 0, 2, 6, 7, 10, 12, 15, 19, 2, 6, 7, 10, 12, 15, 19, 0, -// 0 1 2 3 4 5 6 7 8 9 : ; < = > ? - 1, 3, 4, 5, 8, 9, 11, 13, 14, 16, 2, 6, 7, 10, 12, 15, -// @ A B C D E F G H I J K L M N O - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 10, 11, 12, 13, 14, -// P Q R S T U V W X Y Z [ \ ] ^ _ - 15, 12, 16, 17, 18, 19, 2, 10, 15, 7, 19, 2, 6, 7, 10, 0, -// ` a b c d e f g h i j k l m n o - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 10, 11, 12, 13, 14, -// p q r s t u v w x y z { | } ~ - 15, 12, 16, 17, 18, 19, 2, 10, 15, 7, 19, 2, 6, 7, 10, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 6, 7, 10, 12, 15, 19, 2, 6, 7, 10, 12, 15, 19, 0, - 1, 3, 4, 5, 8, 9, 11, 13, 14, 16, 2, 6, 7, 10, 12, 15, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 10, 11, 12, 13, 14, - 15, 12, 16, 17, 18, 19, 2, 10, 15, 7, 19, 2, 6, 7, 10, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 10, 11, 12, 13, 14, - 15, 12, 16, 17, 18, 19, 2, 10, 15, 7, 19, 2, 6, 7, 10, 0 -}; - -/* - The entry bitCount[i] (for i between 0 and 255) is the number of - bits used to represent i in binary. -*/ -static const char bitCount[256] = { - 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 -}; - -class TQCoMatrix -{ -public: - /* - The matrix has 20 * 20 = 400 entries. This requires 50 bytes, or - 13 words. Some operations are performed on words for more - efficiency. - */ - union { - TQ_UINT8 b[52]; - TQ_UINT32 w[13]; - }; - - TQCoMatrix() { memset( b, 0, 52 ); } - TQCoMatrix( const char *text ) { - char c = '\0', d; - memset( b, 0, 52 ); - while ( (d = *text) != '\0' ) { - setCoocc( c, d ); - if ( (c = *++text) != '\0' ) { - setCoocc( d, c ); - text++; - } - } - } - - void setCoocc( char c, char d ) { - int k = indexOf[(uchar) c] + 20 * indexOf[(uchar) d]; - b[k >> 3] |= k & 0x7; - } - - int worth() const { - int result = 0; - for ( int i = 0; i < 50; i++ ) - result += bitCount[b[i]]; - return result; - } - - static TQCoMatrix reunion( const TQCoMatrix& m, const TQCoMatrix& n ) - { - TQCoMatrix p; - for ( int i = 0; i < 13; i++ ) - p.w[i] = m.w[i] | n.w[i]; - return p; - } - static TQCoMatrix intersection( const TQCoMatrix& m, const TQCoMatrix& n ) - { - TQCoMatrix p; - for ( int i = 0; i < 13; i++ ) - p.w[i] = m.w[i] & n.w[i]; - return p; - } -}; - -/* - Returns an integer between 0 (dissimilar) and 15 (very similar) - depending on how similar the string is to \a target. - - This function is efficient, but its results might change in future - versions of TQt as the algorithm evolves. - - \code - TQString s( "color" ); - a = similarity( s, "color" ); // a == 15 - a = similarity( s, "colour" ); // a == 8 - a = similarity( s, "flavor" ); // a == 4 - a = similarity( s, "dahlia" ); // a == 0 - \endcode -*/ -static int similarity( const TQString& s1, const TQString& s2 ) -{ - TQCoMatrix m1( s1 ); - TQCoMatrix m2( s2 ); - return ( 15 * (TQCoMatrix::intersection(m1, m2).worth() + 1) ) / - ( TQCoMatrix::reunion(m1, m2).worth() + 1 ); -} - -/*! - \class TQPluginManager qpluginmanager.h - \reentrant - \brief The TQPluginManager class provides basic functions to access a certain kind of functionality in libraries. - \ingroup componentmodel - - \internal - - A common usage of components is to extend the existing functionality in an application using plugins. The application - defines interfaces that abstract a certain group of functionality, and a plugin provides a specialized implementation - of one or more of those interfaces. - - The TQPluginManager template has to be instantiated with an interface definition and the IID for this interface. - - \code - TQPluginManager<MyPluginInterface> *manager = new TQPluginManager<MyPluginInterface>( IID_MyPluginInterface ); - \endcode - - It searches a specified directory for all shared libraries, queries for components that implement the specific interface and - reads information about the features the plugin wants to add to the application. The component can provide the set of features - provided by implementing either the TQFeatureListInterface or the TQComponentInformationInterface. The strings returned by the implementations - of - - \code - TQStringList TQFeatureListInterface::featureList() const - \endcode - - or - - \code - TQString TQComponentInformationInterface::name() const - \endcode - - respectively, can then be used to access the component that provides the requested feature: - - \code - MyPluginInterface *iface; - manager->queryInterface( "feature", &iface ); - if ( iface ) - iface->execute( "feature" ); - \endcode - - The application can use a TQPluginManager instance to create parts of the user interface based on the list of features - found in plugins: - - \code - TQPluginManager<MyPluginInterface> *manager = new TQPluginManager<MyPluginInterface>( IID_ImageFilterInterface ); - manager->addLibraryPath(...); - - TQStringList features = manager->featureList(); - for ( TQStringList::Iterator it = features.begin(); it != features.end(); ++it ) { - MyPluginInterface *iface; - manager->queryInterface( *it, &iface ); - - // use TQAction to provide toolbuttons and menuitems for each feature... - } - \endcode -*/ - -/*! - \fn TQPluginManager::TQPluginManager( const TQUuid& id, const TQStringList& paths = TQString::null, const TQString &suffix = TQString::null, bool cs = TRUE ) - - Creates an TQPluginManager for interfaces \a id that will load all shared library files in the \a paths + \a suffix. - If \a cs is FALSE the manager will handle feature strings case insensitive. - - \warning - Setting the cs flag to FALSE requires that components also convert to lower case when comparing with passed strings, so this has - to be handled with care and documented very well. - - \sa TQApplication::libraryPaths() -*/ - - -/*! - \fn TQRESULT TQPluginManager::queryInterface(const TQString& feature, Type** iface) const - - Sets \a iface to point to the interface providing \a feature. - - \sa featureList(), library() -*/ - - - -#include <tqptrlist.h> - -TQGPluginManager::TQGPluginManager( const TQUuid& id, const TQStringList& paths, const TQString &suffix, bool cs ) - : interfaceId( id ), plugDict( 17, cs ), casesens( cs ), autounload( TRUE ) -{ - // Every TQLibrary object is destroyed on destruction of the manager - libDict.setAutoDelete( TRUE ); - for ( TQStringList::ConstIterator it = paths.begin(); it != paths.end(); ++it ) { - TQString path = *it; - addLibraryPath( path + suffix ); - } -} - -TQGPluginManager::~TQGPluginManager() -{ - if ( !autounload ) { - TQDictIterator<TQLibrary> it( libDict ); - while ( it.current() ) { - TQLibrary *lib = it.current(); - ++it; - lib->setAutoUnload( FALSE ); - } - } -} - -void TQGPluginManager::addLibraryPath( const TQString& path ) -{ - if ( !enabled() || !TQDir( path ).exists( ".", TRUE ) ) - return; - -#if defined(TQ_OS_WIN32) - TQString filter = "*.dll"; -#elif defined(TQ_OS_MACX) - TQString filter = "*.dylib; *.so; *.bundle"; -#elif defined(TQ_OS_HPUX) - TQString filter = "*.sl"; -#elif defined(TQ_OS_UNIX) - TQString filter = "*.so"; -#endif - - TQStringList plugins = TQDir(path).entryList( filter ); - for ( TQStringList::Iterator p = plugins.begin(); p != plugins.end(); ++p ) { - TQString lib = TQDir::cleanDirPath( path + "/" + *p ); - if ( libList.contains( lib ) ) - continue; - libList.append( lib ); - } -} - -const TQLibrary* TQGPluginManager::library( const TQString& feature ) const -{ - if ( !enabled() || feature.isEmpty() ) - return 0; - - // We already have a TQLibrary object for this feature - TQLibrary *library = 0; - if ( ( library = plugDict[feature] ) ) - return library; - - // Find the filename that matches the feature request best - TQMap<int, TQStringList> map; - TQStringList::ConstIterator it = libList.begin(); - int best = 0; - int worst = 15; - while ( it != libList.end() ) { - if ( (*it).isEmpty() || libDict[*it] ) { - ++it; - continue; - } - TQString basename = TQFileInfo(*it).baseName(); - int s = similarity( feature, basename ); - if ( s < worst ) - worst = s; - if ( s > best ) - best = s; - map[s].append( basename + TQChar(0xfffd) + *it ); - ++it; - } - - if ( map.isEmpty() ) - return 0; // no libraries to add - - // Start with the best match to get the library object - TQGPluginManager *that = (TQGPluginManager*)this; - for ( int s = best; s >= worst; --s ) { - TQStringList group = map[s]; - group.sort(); // sort according to the base name - TQStringList::ConstIterator git = group.begin(); - while ( git != group.end() ) { - TQString lib = (*git).mid( (*git).find( TQChar(0xfffd) ) + 1 ); - TQString basename = (*git).left( (*git).find( TQChar(0xfffd) ) ); - ++git; - - TQStringList sameBasename; - while( git != group.end() && - basename == (*git).left( (*git).find( TQChar(0xfffd) ) ) ) { - sameBasename << (*git).mid( (*git).find( TQChar(0xfffd) ) + 1 ); - ++git; - } - - if ( sameBasename.isEmpty() ) { - that->addLibrary( new TQComLibrary( lib ) ); - } else { - TQPtrList<TQComLibrary> same; - same.setAutoDelete( TRUE ); - same.append( new TQComLibrary( lib ) ); - for ( TQStringList::ConstIterator bit = sameBasename.begin(); - bit != sameBasename.end(); ++bit ) - same.append( new TQComLibrary( *bit ) ); - TQComLibrary* bestMatch = 0; - for ( TQComLibrary* candidate = same.first(); candidate; candidate = same.next() ) - if ( candidate->qtVersion() && candidate->qtVersion() <= TQT_VERSION - && ( !bestMatch || candidate->qtVersion() > bestMatch->qtVersion() ) ) - bestMatch = candidate; - if ( bestMatch ) { - same.find( bestMatch ); - that->addLibrary( same.take() ); - } - } - - if ( ( library = that->plugDict[feature] ) ) - return library; - } - } - return 0; -} - -TQStringList TQGPluginManager::featureList() const -{ - TQStringList features; - - if ( !enabled() ) - return features; - - TQGPluginManager *that = (TQGPluginManager*)this; - TQStringList theLibs = libList; - TQStringList phase2Libs; - TQStringList phase2Deny; - - /* In order to get the feature list we need to add all interesting - libraries. If there are libraries with the same base name, we - prioritze the one that fits our TQt version number and ignore the - others */ - TQStringList::Iterator it; - for ( it = theLibs.begin(); it != theLibs.end(); ++it ) { - if ( (*it).isEmpty() || libDict[*it] ) - continue; - TQComLibrary* library = new TQComLibrary( *it ); - if ( library->qtVersion() == TQT_VERSION ) { - that->addLibrary( library ); - phase2Deny << TQFileInfo( *it ).baseName(); - } else { - delete library; - phase2Libs << *it; - } - } - for ( it = phase2Libs.begin(); it != phase2Libs.end(); ++it ) - if ( !phase2Deny.contains( TQFileInfo( *it ).baseName() ) ) - that->addLibrary( new TQComLibrary( *it ) ); - - for ( TQDictIterator<TQLibrary> pit( plugDict ); pit.current(); ++pit ) - features << pit.currentKey(); - - return features; -} - -bool TQGPluginManager::addLibrary( TQLibrary* lib ) -{ - if ( !enabled() || !lib ) - return FALSE; - - TQComLibrary* plugin = (TQComLibrary*)lib; - bool useful = FALSE; - - TQUnknownInterface* iFace = 0; - plugin->queryInterface( interfaceId, &iFace ); - if ( iFace ) { - TQFeatureListInterface *fliFace = 0; - TQComponentInformationInterface *cpiFace = 0; - iFace->queryInterface( IID_TQFeatureList, (TQUnknownInterface**)&fliFace ); - if ( !fliFace ) - plugin->queryInterface( IID_TQFeatureList, (TQUnknownInterface**)&fliFace ); - if ( !fliFace ) { - iFace->queryInterface( IID_TQComponentInformation, (TQUnknownInterface**)&cpiFace ); - if ( !cpiFace ) - plugin->queryInterface( IID_TQComponentInformation, (TQUnknownInterface**)&cpiFace ); - } - TQStringList fl; - if ( fliFace ) - // Map all found features to the library - fl = fliFace->featureList(); - else if ( cpiFace ) - fl << cpiFace->name(); - - for ( TQStringList::Iterator f = fl.begin(); f != fl.end(); ++f ) { - TQLibrary *old = plugDict[*f]; - if ( !old ) { - useful = TRUE; - plugDict.replace( *f, plugin ); - } else { - // we have old *and* plugin, which one to pick? - TQComLibrary* first = (TQComLibrary*)old; - TQComLibrary* second = (TQComLibrary*)plugin; - bool takeFirst = TRUE; - if ( first->qtVersion() != TQT_VERSION ) { - if ( second->qtVersion() == TQT_VERSION ) - takeFirst = FALSE; - else if ( second->qtVersion() < TQT_VERSION && - first->qtVersion() > TQT_VERSION ) - takeFirst = FALSE; - } - if ( !takeFirst ) { - useful = TRUE; - plugDict.replace( *f, plugin ); - qWarning("%s: Discarding feature %s in %s!", - (const char*) TQFile::encodeName( plugin->library()), - (*f).latin1(), - (const char*) TQFile::encodeName( old->library() ) ); - } else { - qWarning("%s: Feature %s already defined in %s!", - (const char*) TQFile::encodeName( old->library() ), - (*f).latin1(), - (const char*) TQFile::encodeName( plugin->library() ) ); - } - } - } - if ( fliFace ) - fliFace->release(); - if ( cpiFace ) - cpiFace->release(); - iFace->release(); - } - - if ( useful ) { - libDict.replace( plugin->library(), plugin ); - if ( !libList.contains( plugin->library() ) ) - libList.append( plugin->library() ); - return TRUE; - } - delete plugin; - return FALSE; -} - - -bool TQGPluginManager::enabled() const -{ -#ifdef TQT_SHARED - return TRUE; -#else - return FALSE; -#endif -} - -TQRESULT TQGPluginManager::queryUnknownInterface(const TQString& feature, TQUnknownInterface** iface) const -{ - TQComLibrary* plugin = 0; - plugin = (TQComLibrary*)library( feature ); - return plugin ? plugin->queryInterface( interfaceId, (TQUnknownInterface**)iface ) : TQE_NOINTERFACE; -} - -#endif //TQT_NO_COMPONENT diff --git a/tqtinterface/qt4/src/tools/tqgpluginmanager_p.h b/tqtinterface/qt4/src/tools/tqgpluginmanager_p.h deleted file mode 100644 index dd4709d..0000000 --- a/tqtinterface/qt4/src/tools/tqgpluginmanager_p.h +++ /dev/null @@ -1,108 +0,0 @@ -/********************************************************************** -** -** Definition of TQGPluginManager class -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQGPLUGINMANAGER_P_H -#define TQGPLUGINMANAGER_P_H - -#include "tqdict.h" -#include "tqlibrary.h" -#include "tquuid.h" -#include "tqstringlist.h" -#include "tqcom_p.h" - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of a number of TQt sources files. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// -// - -#ifndef TQT_NO_COMPONENT - -#if defined(TQ_TEMPLATEDLL) -// TQMOC_SKIP_BEGIN -//TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQDict<TQLibrary>; -// TQMOC_SKIP_END -#endif - -class TQ_EXPORT TQGPluginManager -{ -public: - TQGPluginManager( const TQUuid& id, const TQStringList& paths = TQString(), const TQString &suffix = TQString::null, bool cs = TRUE ); - ~TQGPluginManager(); - - void addLibraryPath( const TQString& path ); - const TQLibrary* library( const TQString& feature ) const; - TQStringList featureList() const; - - bool autoUnload() const; - void setAutoUnload( bool ); - -protected: - bool enabled() const; - bool addLibrary( TQLibrary* plugin ); - - TQRESULT queryUnknownInterface(const TQString& feature, TQUnknownInterface** iface) const; - - TQUuid interfaceId; - TQDict<TQLibrary> plugDict; // Dict to match feature with library - TQDict<TQLibrary> libDict; // Dict to match library file with library - TQStringList libList; - - uint casesens : 1; - uint autounload : 1; -}; - -inline void TQGPluginManager::setAutoUnload( bool unload ) -{ - autounload = unload; -} - -inline bool TQGPluginManager::autoUnload() const -{ - return autounload; -} - -#endif - -#endif //TQGPLUGINMANAGER_P_H diff --git a/tqtinterface/qt4/src/tools/tqgvector.cpp b/tqtinterface/qt4/src/tools/tqgvector.cpp deleted file mode 100644 index 4151d54..0000000 --- a/tqtinterface/qt4/src/tools/tqgvector.cpp +++ /dev/null @@ -1,598 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQGVector class -** -** Created : 930907 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqglobal.h" -#if defined(TQ_CC_BOR) -// needed for qsort() because of a std namespace problem on Borland -#include "tqplatformdefs.h" -#endif - -#define TQGVECTOR_CPP -#include "tqgvector.h" -#include "tqglist.h" -#include "tqstring.h" -#include "tqdatastream.h" -#include <stdlib.h> - -#ifdef TQT_THREAD_SUPPORT -# include <private/tqmutexpool_p.h> -#endif // TQT_THREAD_SUPPORT - -#define USE_MALLOC // comment to use new/delete - -#undef NEW -#undef DELETE - -#if defined(USE_MALLOC) -#define NEW(type,size) ((type*)malloc(size*sizeof(type))) -#define DELETE(array) (free((char*)array)) -#else -#define NEW(type,size) (new type[size]) -#define DELETE(array) (delete[] array) -#define DONT_USE_REALLOC // comment to use realloc() -#endif - -/*! - \class TQGVector - \reentrant - \ingroup collection - - \brief The TQGVector class is an internal class for implementing TQt - collection classes. - - \internal - - TQGVector is an internal class that acts as a base class for the - TQPtrVector collection class. - - TQGVector has some virtual functions that may be reimplemented in - subclasses to customize behavior. - - \list - \i compareItems() compares two collection/vector items. - \i read() reads a collection/vector item from a TQDataStream. - \i write() writes a collection/vector item to a TQDataStream. - \endlist -*/ - -/***************************************************************************** - Default implementation of virtual functions - *****************************************************************************/ - -/*! - This virtual function compares two list items. - - Returns: - <ul> - <li> 0 if \a d1 == \a d2 - <li> non-zero if \a d1 != \a d2 - </ul> - - This function returns \e int rather than \e bool so that - reimplementations can return one of three values and use it to sort - by: - <ul> - <li> 0 if \a d1 == \a d2 - <li> \> 0 (positive integer) if \a d1 \> \a d2 - <li> \< 0 (negative integer) if \a d1 \< \a d2 - </ul> - - The TQPtrVector::sort() and TQPtrVector::bsearch() functions require that - compareItems() is implemented as described here. - - This function should not modify the vector because some const - functions call compareItems(). -*/ - -int TQGVector::compareItems( Item d1, Item d2 ) -{ - return d1 != d2; // compare pointers -} - -#ifndef TQT_NO_DATASTREAM -/*! - Reads a collection/vector item from the stream \a s and returns a reference - to the stream. - - The default implementation sets \a d to 0. - - \sa write() -*/ - -TQDataStream &TQGVector::read( TQDataStream &s, Item &d ) -{ // read item from stream - d = 0; - return s; -} - -/*! - Writes a collection/vector item to the stream \a s and returns a reference - to the stream. - - The default implementation does nothing. - - \sa read() -*/ - -TQDataStream &TQGVector::write( TQDataStream &s, Item ) const -{ // write item to stream - return s; -} -#endif // TQT_NO_DATASTREAM - -/***************************************************************************** - TQGVector member functions - *****************************************************************************/ - -TQGVector::TQGVector() // create empty vector -{ - vec = 0; - len = numItems = 0; -} - -TQGVector::TQGVector( uint size ) // create vectors with nullptrs -{ - len = size; - numItems = 0; - if ( len == 0 ) { // zero length - vec = 0; - return; - } - vec = NEW(Item,len); - TQ_CHECK_PTR( vec ); - memset( (void*)vec, 0, len*sizeof(Item) ); // fill with nulls -} - -TQGVector::TQGVector( const TQGVector &a ) // make copy of other vector - : TQPtrCollection( a ) -{ - len = a.len; - numItems = a.numItems; - if ( len == 0 ) { - vec = 0; - return; - } - vec = NEW( Item, len ); - TQ_CHECK_PTR( vec ); - for ( uint i = 0; i < len; i++ ) { - if ( a.vec[i] ) { - vec[i] = newItem( a.vec[i] ); - TQ_CHECK_PTR( vec[i] ); - } else { - vec[i] = 0; - } - } -} - -TQGVector::~TQGVector() -{ - clear(); -} - -TQGVector& TQGVector::operator=( const TQGVector &v ) -{ - if ( &v == this ) - return *this; - - clear(); - len = v.len; - numItems = v.numItems; - if ( len == 0 ) { - vec = 0; - return *this; - } - vec = NEW( Item, len ); - TQ_CHECK_PTR( vec ); - for ( uint i = 0; i < len; i++ ) { - if ( v.vec[i] ) { - vec[i] = newItem( v.vec[i] ); - TQ_CHECK_PTR( vec[i] ); - } else { - vec[i] = 0; - } - } - return *this; -} - - -bool TQGVector::insert( uint index, Item d ) // insert item at index -{ -#if defined(TQT_CHECK_RANGE) - if ( index >= len ) { // range error - qWarning( "TQGVector::insert: Index %d out of range", index ); - return FALSE; - } -#endif - if ( vec[index] ) { // remove old item - deleteItem( vec[index] ); - numItems--; - } - if ( d ) { - vec[index] = newItem( d ); - TQ_CHECK_PTR( vec[index] ); - numItems++; - return vec[index] != 0; - } else { - vec[index] = 0; // reset item - } - return TRUE; -} - -bool TQGVector::remove( uint index ) // remove item at index -{ -#if defined(TQT_CHECK_RANGE) - if ( index >= len ) { // range error - qWarning( "TQGVector::remove: Index %d out of range", index ); - return FALSE; - } -#endif - if ( vec[index] ) { // valid item - deleteItem( vec[index] ); // delete it - vec[index] = 0; // reset pointer - numItems--; - } - return TRUE; -} - -TQPtrCollection::Item TQGVector::take( uint index ) // take out item -{ -#if defined(TQT_CHECK_RANGE) - if ( index >= len ) { // range error - qWarning( "TQGVector::take: Index %d out of range", index ); - return 0; - } -#endif - Item d = vec[index]; // don't delete item - if ( d ) - numItems--; - vec[index] = 0; - return d; -} - -void TQGVector::clear() // clear vector -{ - if ( vec ) { - for ( uint i=0; i<len; i++ ) { // delete each item - if ( vec[i] ) - deleteItem( vec[i] ); - } - DELETE(vec); - vec = 0; - len = numItems = 0; - } -} - -bool TQGVector::resize( uint newsize ) // resize array -{ - if ( newsize == len ) // nothing to do - return TRUE; - if ( vec ) { // existing data - if ( newsize < len ) { // shrink vector - uint i = newsize; - while ( i < len ) { // delete lost items - if ( vec[i] ) { - deleteItem( vec[i] ); - numItems--; - } - i++; - } - } - if ( newsize == 0 ) { // vector becomes empty - DELETE(vec); - vec = 0; - len = numItems = 0; - return TRUE; - } -#if defined(DONT_USE_REALLOC) - if ( newsize == 0 ) { - DELETE(vec); - vec = 0; - return FALSE; - } - Item *newvec = NEW(Item,newsize); // manual realloc - if (!newvec) - return FALSE; - memcpy( newvec, vec, (len < newsize ? len : newsize)*sizeof(Item) ); - DELETE(vec); - vec = newvec; -#else - Item *newvec = (Item*)realloc( (char *)vec, newsize*sizeof(Item) ); - if (!newvec) - return FALSE; - vec = newvec; -#endif - } else { // create new vector - vec = NEW(Item,newsize); - if (!vec) - return FALSE; - len = numItems = 0; - } - if ( newsize > len ) // init extra space added - memset( (void*)&vec[len], 0, (newsize-len)*sizeof(Item) ); - len = newsize; - return TRUE; -} - - -bool TQGVector::fill( Item d, int flen ) // resize and fill vector -{ - if ( flen < 0 ) - flen = len; // default: use vector length - else if ( !resize( flen ) ) - return FALSE; - for ( uint i=0; i<(uint)flen; i++ ) // insert d at every index - insert( i, d ); - return TRUE; -} - - -static TQGVector *sort_vec=0; // current sort vector - - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif - -#ifdef TQ_OS_TEMP -static int _cdecl cmp_vec( const void *n1, const void *n2 ) -#else -static int cmp_vec( const void *n1, const void *n2 ) -#endif -{ - return sort_vec->compareItems( *((TQPtrCollection::Item*)n1), *((TQPtrCollection::Item*)n2) ); -} - -#if defined(TQ_C_CALLBACKS) -} -#endif - - -void TQGVector::sort() // sort vector -{ - if ( count() == 0 ) // no elements - return; - register Item *start = &vec[0]; - register Item *end = &vec[len-1]; - Item tmp; - for (;;) { // put all zero elements behind - while ( start < end && *start != 0 ) - start++; - while ( end > start && *end == 0 ) - end--; - if ( start < end ) { - tmp = *start; - *start = *end; - *end = tmp; - } else { - break; - } - } - -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker locker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &sort_vec ) : 0 ); -#endif // TQT_THREAD_SUPPORT - - sort_vec = (TQGVector*)this; - qsort( vec, count(), sizeof(Item), cmp_vec ); - sort_vec = 0; -} - -int TQGVector::bsearch( Item d ) const // binary search; when sorted -{ - if ( !len ) - return -1; - if ( !d ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQGVector::bsearch: Cannot search for null object" ); -#endif - return -1; - } - int n1 = 0; - int n2 = len - 1; - int mid = 0; - bool found = FALSE; - while ( n1 <= n2 ) { - int res; - mid = (n1 + n2)/2; - if ( vec[mid] == 0 ) // null item greater - res = -1; - else - res = ((TQGVector*)this)->compareItems( d, vec[mid] ); - if ( res < 0 ) - n2 = mid - 1; - else if ( res > 0 ) - n1 = mid + 1; - else { // found it - found = TRUE; - break; - } - } - if ( !found ) - return -1; - // search to first of equal items - while ( (mid - 1 >= 0) && !((TQGVector*)this)->compareItems(d, vec[mid-1]) ) - mid--; - return mid; -} - -int TQGVector::findRef( Item d, uint index) const // find exact item in vector -{ -#if defined(TQT_CHECK_RANGE) - if ( index > len ) { // range error - qWarning( "TQGVector::findRef: Index %d out of range", index ); - return -1; - } -#endif - for ( uint i=index; i<len; i++ ) { - if ( vec[i] == d ) - return i; - } - return -1; -} - -int TQGVector::find( Item d, uint index ) const // find equal item in vector -{ -#if defined(TQT_CHECK_RANGE) - if ( index >= len ) { // range error - qWarning( "TQGVector::find: Index %d out of range", index ); - return -1; - } -#endif - for ( uint i=index; i<len; i++ ) { - if ( vec[i] == 0 && d == 0 ) // found null item - return i; - if ( vec[i] && ((TQGVector*)this)->compareItems( vec[i], d ) == 0 ) - return i; - } - return -1; -} - -uint TQGVector::containsRef( Item d ) const // get number of exact matches -{ - uint count = 0; - for ( uint i=0; i<len; i++ ) { - if ( vec[i] == d ) - count++; - } - return count; -} - -uint TQGVector::contains( Item d ) const // get number of equal matches -{ - uint count = 0; - for ( uint i=0; i<len; i++ ) { - if ( vec[i] == 0 && d == 0 ) // count null items - count++; - if ( vec[i] && ((TQGVector*)this)->compareItems( vec[i], d ) == 0 ) - count++; - } - return count; -} - -bool TQGVector::insertExpand( uint index, Item d )// insert and grow if necessary -{ - if ( index >= len ) { - if ( !resize( index+1 ) ) // no memory - return FALSE; - } - insert( index, d ); - return TRUE; -} - -void TQGVector::toList( TQGList *list ) const // store items in list -{ - list->clear(); - for ( uint i=0; i<len; i++ ) { - if ( vec[i] ) - list->append( vec[i] ); - } -} - - -void TQGVector::warningIndexRange( uint i ) -{ -#if defined(TQT_CHECK_RANGE) - qWarning( "TQGVector::operator[]: Index %d out of range", i ); -#else - TQ_UNUSED( i ) -#endif -} - - -/***************************************************************************** - TQGVector stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -TQDataStream &operator>>( TQDataStream &s, TQGVector &vec ) -{ // read vector - return vec.read( s ); -} - -TQDataStream &operator<<( TQDataStream &s, const TQGVector &vec ) -{ // write vector - return vec.write( s ); -} - -TQDataStream &TQGVector::read( TQDataStream &s ) // read vector from stream -{ - uint num; - s >> num; // read number of items - clear(); // clear vector - resize( num ); - for (uint i=0; i<num; i++) { // read all items - Item d; - read( s, d ); - TQ_CHECK_PTR( d ); - if ( !d ) // no memory - break; - vec[i] = d; - } - return s; -} - -TQDataStream &TQGVector::write( TQDataStream &s ) const -{ // write vector to stream - uint num = count(); - s << num; // number of items to write - num = size(); - for (uint i=0; i<num; i++) { // write non-null items - if ( vec[i] ) - write( s, vec[i] ); - } - return s; -} - -/* Returns whether v equals this vector or not */ - -bool TQGVector::operator==( const TQGVector &v ) const -{ - if ( size() != v.size() ) - return FALSE; - if ( count() != v.count() ) - return FALSE; - for ( int i = 0; i < (int)size(); ++i ) { - if ( ( (TQGVector*)this )->compareItems( at( i ), v.at( i ) ) != 0 ) - return FALSE; - } - return TRUE; -} - -#endif // TQT_NO_DATASTREAM diff --git a/tqtinterface/qt4/src/tools/tqgvector.h b/tqtinterface/qt4/src/tools/tqgvector.h deleted file mode 100644 index ebb5e03..0000000 --- a/tqtinterface/qt4/src/tools/tqgvector.h +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** -** -** Definition of TQGVector class -** -** Created : 930907 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQGVECTOR_H -#define TQGVECTOR_H - -#ifndef TQT_H -#include "tqptrcollection.h" -#endif // TQT_H - - -class TQ_EXPORT TQGVector : public TQPtrCollection // generic vector -{ -friend class TQGList; // needed by TQGList::toVector -public: -#ifndef TQT_NO_DATASTREAM - TQDataStream &read( TQDataStream & ); // read vector from stream - TQDataStream &write( TQDataStream & ) const; // write vector to stream -#endif - virtual int compareItems( Item, Item ); - -protected: - TQGVector(); // create empty vector - TQGVector( uint size ); // create vector with nullptrs - TQGVector( const TQGVector &v ); // make copy of other vector - ~TQGVector(); - - TQGVector &operator=( const TQGVector &v ); // assign from other vector - bool operator==( const TQGVector &v ) const; - - Item *data() const { return vec; } - uint size() const { return len; } - uint count() const { return numItems; } - - bool insert( uint index, Item ); // insert item at index - bool remove( uint index ); // remove item - Item take( uint index ); // take out item - - void clear(); // clear vector - bool resize( uint newsize ); // resize vector - - bool fill( Item, int flen ); // resize and fill vector - - void sort(); // sort vector - int bsearch( Item ) const; // binary search (when sorted) - - int findRef( Item, uint index ) const; // find exact item in vector - int find( Item, uint index ) const; // find equal item in vector - uint containsRef( Item ) const; // get number of exact matches - uint contains( Item ) const; // get number of equal matches - - Item at( uint index ) const // return indexed item - { -#if defined(TQT_CHECK_RANGE) - if ( index >= len ) - warningIndexRange( index ); -#endif - return vec[index]; - } - - bool insertExpand( uint index, Item ); // insert, expand if necessary - - void toList( TQGList * ) const; // put items in list - -#ifndef TQT_NO_DATASTREAM - virtual TQDataStream &read( TQDataStream &, Item & ); - virtual TQDataStream &write( TQDataStream &, Item ) const; -#endif -private: - Item *vec; - uint len; - uint numItems; - - static void warningIndexRange( uint ); -}; - - -/***************************************************************************** - TQGVector stream functions - *****************************************************************************/ - -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQGVector & ); -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQGVector & ); -#endif - -#endif // TQGVECTOR_H diff --git a/tqtinterface/qt4/src/tools/tqintcache.h b/tqtinterface/qt4/src/tools/tqintcache.h deleted file mode 100644 index 239a40c..0000000 --- a/tqtinterface/qt4/src/tools/tqintcache.h +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** -** -** Definition of TQIntCache template class -** -** Created : 950209 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQINTCACHE_H -#define TQINTCACHE_H - -#ifndef TQT_H -#include "tqgcache.h" -#endif // TQT_H - - -template<class type> -class TQIntCache -#ifdef TQ_TQDOC - : public TQPtrCollection -#else - : public TQGCache -#endif -{ -public: - TQIntCache( const TQIntCache<type> &c ) : TQGCache(c) {} - TQIntCache( int maxCost=100, int size=17 ) - : TQGCache( maxCost, size, IntKey, FALSE, FALSE ) {} - ~TQIntCache() { clear(); } - TQIntCache<type> &operator=( const TQIntCache<type> &c ) - { return (TQIntCache<type>&)TQGCache::operator=(c); } - int maxCost() const { return TQGCache::maxCost(); } - int totalCost() const { return TQGCache::totalCost(); } - void setMaxCost( int m) { TQGCache::setMaxCost(m); } - uint count() const { return TQGCache::count(); } - uint size() const { return TQGCache::size(); } - bool isEmpty() const { return TQGCache::count() == 0; } - bool insert( long k, const type *d, int c=1, int p=0 ) - { return TQGCache::insert_other((const char*)k,(Item)d,c,p); } - bool remove( long k ) - { return TQGCache::remove_other((const char*)k); } - type *take( long k ) - { return (type *)TQGCache::take_other((const char*)k);} - void clear() { TQGCache::clear(); } - type *find( long k, bool ref=TRUE ) const - { return (type *)TQGCache::find_other( (const char*)k,ref);} - type *operator[]( long k ) const - { return (type *)TQGCache::find_other( (const char*)k); } - void statistics() const { TQGCache::statistics(); } -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQIntCache<void>::deleteItem( TQPtrCollection::Item ) -{ -} -#endif - -template<class type> inline void TQIntCache<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type *)d; -} - -template<class type> -class TQIntCacheIterator : public TQGCacheIterator -{ -public: - TQIntCacheIterator( const TQIntCache<type> &c ) - : TQGCacheIterator( (TQGCache &)c ) {} - TQIntCacheIterator( const TQIntCacheIterator<type> &ci ) - : TQGCacheIterator((TQGCacheIterator &)ci) {} - TQIntCacheIterator<type> &operator=( const TQIntCacheIterator<type>&ci ) - { return ( TQIntCacheIterator<type>&)TQGCacheIterator::operator=( ci );} - uint count() const { return TQGCacheIterator::count(); } - bool isEmpty() const { return TQGCacheIterator::count() == 0; } - bool atFirst() const { return TQGCacheIterator::atFirst(); } - bool atLast() const { return TQGCacheIterator::atLast(); } - type *toFirst() { return (type *)TQGCacheIterator::toFirst(); } - type *toLast() { return (type *)TQGCacheIterator::toLast(); } - operator type *() const { return (type *)TQGCacheIterator::get(); } - type *current() const { return (type *)TQGCacheIterator::get(); } - long currentKey() const { return (long)TQGCacheIterator::getKeyInt();} - type *operator()() { return (type *)TQGCacheIterator::operator()();} - type *operator++() { return (type *)TQGCacheIterator::operator++(); } - type *operator+=(uint j) { return (type *)TQGCacheIterator::operator+=(j);} - type *operator--() { return (type *)TQGCacheIterator::operator--(); } - type *operator-=(uint j) { return (type *)TQGCacheIterator::operator-=(j);} -}; - - -#endif // TQINTCACHE_H diff --git a/tqtinterface/qt4/src/tools/tqintdict.h b/tqtinterface/qt4/src/tools/tqintdict.h deleted file mode 100644 index 35a821f..0000000 --- a/tqtinterface/qt4/src/tools/tqintdict.h +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************************** -** -** Definition of TQIntDict template class -** -** Created : 940624 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQINTDICT_H -#define TQINTDICT_H - -#ifndef TQT_H -#include "tqgdict.h" -#endif // TQT_H - -template<class type> -class TQIntDict -#ifdef TQ_TQDOC - : public TQPtrCollection -#else - : public TQGDict -#endif -{ -public: - TQIntDict(int size=17) : TQGDict(size,IntKey,0,0) {} - TQIntDict( const TQIntDict<type> &d ) : TQGDict(d) {} - ~TQIntDict() { clear(); } - TQIntDict<type> &operator=(const TQIntDict<type> &d) - { return (TQIntDict<type>&)TQGDict::operator=(d); } - uint count() const { return TQGDict::count(); } - uint size() const { return TQGDict::size(); } - bool isEmpty() const { return TQGDict::count() == 0; } - void insert( long k, const type *d ) - { TQGDict::look_int(k,(Item)d,1); } - void replace( long k, const type *d ) - { TQGDict::look_int(k,(Item)d,2); } - bool remove( long k ) { return TQGDict::remove_int(k); } - type *take( long k ) { return (type*)TQGDict::take_int(k); } - type *find( long k ) const - { return (type *)((TQGDict*)this)->TQGDict::look_int(k,0,0); } - type *operator[]( long k ) const - { return (type *)((TQGDict*)this)->TQGDict::look_int(k,0,0); } - void clear() { TQGDict::clear(); } - void resize( uint n ) { TQGDict::resize(n); } - void statistics() const { TQGDict::statistics(); } - -#ifdef TQ_TQDOC -protected: - virtual TQDataStream& read( TQDataStream &, TQPtrCollection::Item & ); - virtual TQDataStream& write( TQDataStream &, TQPtrCollection::Item ) const; -#endif - -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQIntDict<void>::deleteItem( TQPtrCollection::Item ) -{ -} -#endif - -template<class type> inline void TQIntDict<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type*)d; -} - -template<class type> -class TQIntDictIterator : public TQGDictIterator -{ -public: - TQIntDictIterator(const TQIntDict<type> &d) :TQGDictIterator((TQGDict &)d) {} - ~TQIntDictIterator() {} - uint count() const { return dict->count(); } - bool isEmpty() const { return dict->count() == 0; } - type *toFirst() { return (type *)TQGDictIterator::toFirst(); } - operator type *() const { return (type *)TQGDictIterator::get(); } - type *current() const { return (type *)TQGDictIterator::get(); } - long currentKey() const { return TQGDictIterator::getKeyInt(); } - type *operator()() { return (type *)TQGDictIterator::operator()(); } - type *operator++() { return (type *)TQGDictIterator::operator++(); } - type *operator+=(uint j) { return (type *)TQGDictIterator::operator+=(j);} -}; - -#define TQ_DEFINED_TQINTDICT -#include "tqwinexport.h" -#endif // TQINTDICT_H diff --git a/tqtinterface/qt4/src/tools/tqiodevice.cpp b/tqtinterface/qt4/src/tools/tqiodevice.cpp deleted file mode 100644 index c2e48ce..0000000 --- a/tqtinterface/qt4/src/tools/tqiodevice.cpp +++ /dev/null @@ -1,769 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQIODevice class -** -** Created : 940913 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqiodevice.h" - -#ifdef USE_QT4 - -#else // USE_QT4 - -/*! - \class TQIODevice tqiodevice.h - \reentrant - - \brief The TQIODevice class is the base class of I/O tqdevices. - - \ingroup io - - An I/O tqdevice represents a medium that one can read bytes from - and/or write bytes to. The TQIODevice class is the abstract - superclass of all such tqdevices; classes such as TQFile, TQBuffer and - TQSocket inherit TQIODevice and implement virtual functions such as - write() appropriately. - - Although applications sometimes use TQIODevice directly, it is - usually better to use TQTextStream and TQDataStream, which provide - stream operations on any TQIODevice subclass. TQTextStream provides - text-oriented stream functionality (for human-readable ASCII - files, for example), whereas TQDataStream deals with binary data in - a totally platform-independent manner. - - The public member functions in TQIODevice roughly fall into two - groups: the action functions and the state access functions. The - most important action functions are: - - \list - - \i open() opens a tqdevice for reading and/or writing, depending on - the mode argument. - - \i close() closes the tqdevice and tidies up (e.g. flushes buffered - data) - - \i readBlock() reads a block of data from the tqdevice. - - \i writeBlock() writes a block of data to the tqdevice. - - \i readLine() reads a line (of text, usually) from the tqdevice. - - \i flush() ensures that all buffered data are written to the real tqdevice. - - \endlist - - There are also some other, less used, action functions: - - \list - - \i getch() reads a single character. - - \i ungetch() forgets the last call to getch(), if possible. - - \i putch() writes a single character. - - \i size() returns the size of the tqdevice, if there is one. - - \i at() returns the current read/write pointer's position, if there - is one for this tqdevice, or it moves the pointer if given an offset. - - \i atEnd() indicates whether there is more to read, if this is - meaningful for this tqdevice. - - \i reset() moves the read/write pointer to the start of the - tqdevice, if that is possible for this tqdevice. - - \endlist - - The state access are all "get" functions. The TQIODevice subclass - calls setState() to update the state, and simple access functions - tell the user of the tqdevice what the tqdevice's state is. Here are - the settings, and their associated access functions: - - \list - - \i Access type. Some tqdevices are direct access (it is possible - to read/write anywhere), whereas others are sequential. TQIODevice - provides the access functions (isDirectAccess(), - isSequentialAccess(), and isCombinedAccess()) to tell users what a - given I/O tqdevice supports. - - \i Buffering. Some tqdevices are accessed in raw mode, whereas - others are buffered. Buffering usually provides greater - efficiency, particularly for small read/write operations. - isBuffered() tells the user whether a given tqdevice is buffered. - (This can often be set by the application in the call to open().) - - \i Synchronicity. Synchronous tqdevices work immediately (for - example, files). When you read from a file, the file delivers its - data straight away. Other kinds of tqdevice, such as a socket - connected to a HTTP server, may not deliver the data until seconds - after you ask to read it. isSynchronous() and isAsynchronous() - tell the user how this tqdevice operates. - - \i CR/LF translation. For simplicity, applications often like to - see just a single CR/LF style, and TQIODevice subclasses can - provide this. isTranslated() returns TRUE if this object - translates CR/LF to just LF. (This can often be set by the - application in the call to open().) - - \i Permissions. Some files cannot be written. For example, - isReadable(), isWritable() and isReadWrite() tell the application - whether it can read from and write to a given tqdevice. (This can - often be set by the application in the call to open().) - - \i Finally, isOpen() returns TRUE if the tqdevice is open, i.e. - after an open() call. - - \endlist - - TQIODevice provides numerous pure virtual functions that you need - to implement when subclassing it. Here is a skeleton subclass with - all the members you are sure to need and some that you will - probably need: - - \code - class MyDevice : public TQIODevice - { - public: - MyDevice(); - ~MyDevice(); - - bool open( int mode ); - void close(); - void flush(); - - uint size() const; - int at() const; // non-pure virtual - bool at( int ); // non-pure virtual - bool atEnd() const; // non-pure virtual - - int readBlock( char *data, uint maxlen ); - int writeBlock( const char *data, uint len ); - int readLine( char *data, uint maxlen ); - - int getch(); - int putch( int ); - int ungetch( int ); - }; - \endcode - - The three non-pure virtual functions need not be reimplemented for - sequential tqdevices. - - \sa TQDataStream, TQTextStream -*/ - -/*! - \enum TQIODevice::Offset - - The offset within the tqdevice. -*/ - - -/*! - Constructs an I/O tqdevice. -*/ - -TQIODevice::TQIODevice() -{ - ioMode = 0; // initial mode - ioSt = IO_Ok; - ioIndex = 0; -} - -/*! - Destroys the I/O tqdevice. -*/ - -TQIODevice::~TQIODevice() -{ -} - - -/*! - \fn int TQIODevice::flags() const - - Returns the current I/O tqdevice flags setting. - - Flags consists of mode flags and state flags. - - \sa mode(), state() -*/ - -/*! - \fn int TQIODevice::mode() const - - Returns bits OR'ed together that specify the current operation - mode. - - These are the flags that were given to the open() function. - - The flags are \c IO_ReadOnly, \c IO_WriteOnly, \c IO_ReadWrite, - \c IO_Append, \c IO_Truncate and \c IO_Translate. -*/ - -/*! - \fn int TQIODevice::state() const - - Returns bits OR'ed together that specify the current state. - - The flags are: \c IO_Open. - - Subclasses may define additional flags. -*/ - -/*! - \fn bool TQIODevice::isDirectAccess() const - - Returns TRUE if the I/O tqdevice is a direct access tqdevice; - otherwise returns FALSE, i.e. if the tqdevice is a sequential access - tqdevice. - - \sa isSequentialAccess() -*/ - -/*! - \fn bool TQIODevice::isSequentialAccess() const - - Returns TRUE if the tqdevice is a sequential access tqdevice; - otherwise returns FALSE, i.e. if the tqdevice is a direct access - tqdevice. - - Operations involving size() and at(int) are not valid on - sequential tqdevices. - - \sa isDirectAccess() -*/ - -/*! - \fn bool TQIODevice::isCombinedAccess() const - - Returns TRUE if the I/O tqdevice is a combined access (both direct - and sequential) tqdevice; otherwise returns FALSE. - - This access method is currently not in use. -*/ - -/*! - \fn bool TQIODevice::isBuffered() const - - Returns TRUE if the I/O tqdevice is a buffered tqdevice; otherwise - returns FALSE, i.e. the tqdevice is a raw tqdevice. - - \sa isRaw() -*/ - -/*! - \fn bool TQIODevice::isRaw() const - - Returns TRUE if the tqdevice is a raw tqdevice; otherwise returns - FALSE, i.e. if the tqdevice is a buffered tqdevice. - - \sa isBuffered() -*/ - -/*! - \fn bool TQIODevice::isSynchronous() const - - Returns TRUE if the I/O tqdevice is a synchronous tqdevice; otherwise - returns FALSE, i.e. the tqdevice is an asynchronous tqdevice. - - \sa isAsynchronous() -*/ - -/*! - \fn bool TQIODevice::isAsynchronous() const - - Returns TRUE if the tqdevice is an asynchronous tqdevice; otherwise - returns FALSE, i.e. if the tqdevice is a synchronous tqdevice. - - This mode is currently not in use. - - \sa isSynchronous() -*/ - -/*! - \fn bool TQIODevice::isTranslated() const - - Returns TRUE if the I/O tqdevice translates carriage-return and - linefeed characters; otherwise returns FALSE. - - A TQFile is translated if it is opened with the \c IO_Translate - mode flag. -*/ - -/*! - \fn bool TQIODevice::isReadable() const - - Returns TRUE if the I/O tqdevice was opened using \c IO_ReadOnly or - \c IO_ReadWrite mode; otherwise returns FALSE. - - \sa isWritable(), isReadWrite() -*/ - -/*! - \fn bool TQIODevice::isWritable() const - - Returns TRUE if the I/O tqdevice was opened using \c IO_WriteOnly or - \c IO_ReadWrite mode; otherwise returns FALSE. - - \sa isReadable(), isReadWrite() -*/ - -/*! - \fn bool TQIODevice::isReadWrite() const - - Returns TRUE if the I/O tqdevice was opened using \c IO_ReadWrite - mode; otherwise returns FALSE. - - \sa isReadable(), isWritable() -*/ - -/*! - \fn bool TQIODevice::isInactive() const - - Returns TRUE if the I/O tqdevice state is 0, i.e. the tqdevice is not - open; otherwise returns FALSE. - - \sa isOpen() -*/ - -/*! - \fn bool TQIODevice::isOpen() const - - Returns TRUE if the I/O tqdevice has been opened; otherwise returns - FALSE. - - \sa isInactive() -*/ - - -/*! - \fn int TQIODevice::status() const - - Returns the I/O tqdevice status. - - The I/O tqdevice status returns an error code. If open() returns - FALSE or readBlock() or writeBlock() return -1, this function can - be called to find out the reason why the operation failed. - - \keyword IO_Ok - \keyword IO_ReadError - \keyword IO_WriteError - \keyword IO_FatalError - \keyword IO_OpenError - \keyword IO_ConnectError - \keyword IO_AbortError - \keyword IO_TimeOutError - \keyword IO_UnspecifiedError - - The status codes are: - \table - \header \i tqStatus code \i Meaning - \row \i \c IO_Ok \i The operation was successful. - \row \i \c IO_ReadError \i Could not read from the tqdevice. - \row \i \c IO_WriteError \i Could not write to the tqdevice. - \row \i \c IO_FatalError \i A fatal unrecoverable error occurred. - \row \i \c IO_OpenError \i Could not open the tqdevice. - \row \i \c IO_ConnectError \i Could not connect to the tqdevice. - \row \i \c IO_AbortError \i The operation was unexpectedly aborted. - \row \i \c IO_TimeOutError \i The operation timed out. - \row \i \c IO_UnspecifiedError \i An unspecified error happened on close. - \endtable - - \sa resetqStatus() -*/ - -/*! - \fn void TQIODevice::resetqStatus() - - Sets the I/O tqdevice status to \c IO_Ok. - - \sa status() -*/ - - -/*! - \fn void TQIODevice::setFlags( int flags ) - - Used by subclasses to set the tqdevice flags to the \a flags specified. -*/ - -/*! - \fn void TQIODevice::setType( int type ) - - Used by subclasses to set the tqdevice type to the \a type specified. -*/ - -void TQIODevice::setType( int t ) -{ -#if defined(TQT_CHECK_RANGE) - if ( (t & IO_TypeMask) != t ) - qWarning( "TQIODevice::setType: Specified type out of range" ); -#endif - ioMode &= ~IO_TypeMask; // reset type bits - ioMode |= t; -} - -/*! - \fn void TQIODevice::setMode( int mode ) - - Used by subclasses to set the tqdevice mode to the \a mode specified. -*/ - -void TQIODevice::setMode( int m ) -{ -#if defined(TQT_CHECK_RANGE) - if ( (m & IO_ModeMask) != m ) - qWarning( "TQIODevice::setMode: Specified mode out of range" ); -#endif - ioMode &= ~IO_ModeMask; // reset mode bits - ioMode |= m; -} - -/*! - \fn void TQIODevice::setState( int state ) - - Used by subclasses to set the tqdevice state to the \a state specified. -*/ - -void TQIODevice::setState( int s ) -{ -#if defined(TQT_CHECK_RANGE) - if ( ((uint)s & IO_StateMask) != (uint)s ) - qWarning( "TQIODevice::setState: Specified state out of range" ); -#endif - ioMode &= ~IO_StateMask; // reset state bits - ioMode |= (uint)s; -} - -/*! - Used by subclasses to set the tqdevice status (not state) to \a s. -*/ - -void TQIODevice::setqStatus( int s ) -{ - ioSt = s; -} - - -/*! - \fn bool TQIODevice::open( int mode ) - - Opens the I/O tqdevice using the specified \a mode. Returns TRUE if - the tqdevice was successfully opened; otherwise returns FALSE. - - The mode parameter \a mode must be an OR'ed combination of the - following flags. - \table - \header \i Mode flags \i Meaning - \row \i \c IO_Raw \i specifies raw (unbuffered) file access. - \row \i \c IO_ReadOnly \i opens a file in read-only mode. - \row \i \c IO_WriteOnly \i opens a file in write-only mode. - \row \i \c IO_ReadWrite \i opens a file in read/write mode. - \row \i \c IO_Append \i sets the file index to the end of the file. - \row \i \c IO_Truncate \i truncates the file. - \row \i \c IO_Translate \i enables carriage returns and linefeed - translation for text files under MS-DOS, Windows and Macintosh. On - Unix systems this flag has no effect. Use with caution as it will - also transform every linefeed written to the file into a CRLF - pair. This is likely to corrupt your file if you write write - binary data. Cannot be combined with \c IO_Raw. - \endtable - - This virtual function must be reimplemented by all subclasses. - - \sa close() -*/ - -/*! - \fn void TQIODevice::close() - - Closes the I/O tqdevice. - - This virtual function must be reimplemented by all subclasses. - - \sa open() -*/ - -/*! - \fn void TQIODevice::flush() - - Flushes an open I/O tqdevice. - - This virtual function must be reimplemented by all subclasses. -*/ - - -/*! - \fn TQIODevice::Offset TQIODevice::size() const - - Virtual function that returns the size of the I/O tqdevice. - - \sa at() -*/ - -/*! - Virtual function that returns the current I/O tqdevice position. - - This is the position of the data read/write head of the I/O - tqdevice. - - \sa size() -*/ - -TQIODevice::Offset TQIODevice::at() const -{ - return ioIndex; -} - - -/* - The following is a "bad" overload, since it does "not behave essentially - the same" like the above. So don't use \overload in the documentation of - this function and we have to live with the qdoc warning which is generated - for this. -*/ -/*! - Virtual function that sets the I/O tqdevice position to \a pos. - Returns TRUE if the position was successfully set, i.e. \a pos is - within range and the seek was successful; otherwise returns FALSE. - - \sa size() -*/ - -bool TQIODevice::at( Offset pos ) -{ -#if defined(TQT_CHECK_RANGE) - if ( pos > size() ) { -#if defined(TQT_ABI_QT4) - qWarning( "TQIODevice::at: Index %lld out of range", pos ); -#else - qWarning( "TQIODevice::at: Index %lu out of range", pos ); -#endif - return FALSE; - } -#endif - ioIndex = pos; - return TRUE; -} - -/*! - Virtual function that returns TRUE if the I/O tqdevice position is - at the end of the input; otherwise returns FALSE. -*/ - -bool TQIODevice::atEnd() const -{ - if ( isSequentialAccess() || isTranslated() ) { - TQIODevice* that = (TQIODevice*)this; - const int oldtqStatus = ioSt; - int c = that->getch(); - bool result = c < 0; - that->ungetch(c); - if (ioSt != oldtqStatus) - that->ioSt = oldtqStatus; - return result; - } else { - return at() == size(); - } -} - -/*! - \fn bool TQIODevice::reset() - - Sets the tqdevice index position to 0. - - \sa at() -*/ - - -/*! - \fn int TQIODevice::readBlock( char *data, TQ_ULONG maxlen ) - - Reads at most \a maxlen bytes from the I/O tqdevice into \a data and - returns the number of bytes actually read. - - This function should return -1 if a fatal error occurs and should - return 0 if there are no bytes to read. - - The tqdevice must be opened for reading, and \a data must not be 0. - - This virtual function must be reimplemented by all subclasses. - - \sa writeBlock() isOpen() isReadable() -*/ - -/*! - This convenience function returns all of the remaining data in the - tqdevice. -*/ -TQByteArray TQIODevice::readAll() -{ - if ( isDirectAccess() ) { - // we know the size - int n = size()-at(); // ### fix for 64-bit or large files? - int totalRead = 0; - TQByteArray ba( n ); - char* c = ba.data(); - while ( n ) { - int r = readBlock( c, n ); - if ( r < 0 ) - return TQByteArray(); - n -= r; - c += r; - totalRead += r; - // If we have a translated file, then it is possible that - // we read less bytes than size() reports - if ( atEnd() ) { - ba.resize( totalRead ); - break; - } - } - return ba; - } else { - // read until we reach the end - const int blocksize = 512; - int nread = 0; - TQByteArray ba; - while ( !atEnd() ) { - ba.resize( nread + blocksize ); - int r = readBlock( ba.data()+nread, blocksize ); - if ( r < 0 ) - return TQByteArray(); - nread += r; - } - ba.resize( nread ); - return ba; - } -} - -/*! - \fn int TQIODevice::writeBlock( const char *data, TQ_ULONG len ) - - Writes \a len bytes from \a data to the I/O tqdevice and returns the - number of bytes actually written. - - This function should return -1 if a fatal error occurs. - - This virtual function must be reimplemented by all subclasses. - - \sa readBlock() -*/ - -/*! - \overload - - This convenience function is the same as calling writeBlock( - data.data(), data.size() ). -*/ -TQ_LONG TQIODevice::writeBlock( const TQByteArray& data ) -{ - return writeBlock( data.data(), data.size() ); -} - -/*! - Reads a line of text, (or up to \a maxlen bytes if a newline isn't - encountered) plus a terminating '\0' into \a data. If there is a - newline at the end if the line, it is not stripped. - - Returns the number of bytes read including the terminating '\0', - or -1 if an error occurred. - - This virtual function can be reimplemented much more efficiently - by the most subclasses. - - \sa readBlock(), TQTextStream::readLine() -*/ - -TQ_LONG TQIODevice::readLine( char *data, TQ_ULONG maxlen ) -{ - if ( maxlen == 0 ) // application bug? - return 0; - char *p = data; - while ( --maxlen && (readBlock(p,1)>0) ) { // read one byte at a time - if ( *p++ == '\n' ) // end of line - break; - } - *p++ = '\0'; - return p - data; -} - - -/*! - \fn int TQIODevice::getch() - - Reads a single byte/character from the I/O tqdevice. - - Returns the byte/character read, or -1 if the end of the I/O - tqdevice has been reached. - - This virtual function must be reimplemented by all subclasses. - - \sa putch(), ungetch() -*/ - -/*! - \fn int TQIODevice::putch( int ch ) - - Writes the character \a ch to the I/O tqdevice. - - Returns \a ch, or -1 if an error occurred. - - This virtual function must be reimplemented by all subclasses. - - \sa getch(), ungetch() -*/ - -/*! - \fn int TQIODevice::ungetch( int ch ) - - Puts the character \a ch back into the I/O tqdevice and decrements - the index position if it is not zero. - - This function is normally called to "undo" a getch() operation. - - Returns \a ch, or -1 if an error occurred. - - This virtual function must be reimplemented by all subclasses. - - \sa getch(), putch() -*/ - -#endif // USE_QT4 diff --git a/tqtinterface/qt4/src/tools/tqiodevice.h b/tqtinterface/qt4/src/tools/tqiodevice.h deleted file mode 100644 index 6fccc9d..0000000 --- a/tqtinterface/qt4/src/tools/tqiodevice.h +++ /dev/null @@ -1,311 +0,0 @@ -/**************************************************************************** -** -** Definition of TQIODevice class -** -** Created : 940913 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQIODEVICE_H -#define TQIODEVICE_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqglobal.h" -#include "tqcstring.h" -#endif // TQT_H - -#ifdef USE_QT4 - -#include <Qt/qiodevice.h> -#include <Qt/qfile.h> -#include <iostream> - -#endif // USE_QT4 - -#ifdef USE_QT4 - -#define IO_Direct 0x0100 // direct access tqdevice -#define IO_Sequential 0x0200 // sequential access tqdevice -#define IO_Combined 0x0300 // combined direct/sequential -#define IO_TypeMask 0x0f00 - -// IO handling modes - -#define IO_Raw 0x0040 // raw access (not buffered) -#define IO_Async 0x0080 // asynchronous mode - -// IO tqdevice open modes - -#define IO_ReadOnly (QIODevice::OpenModeFlag)0x0001 // readable tqdevice -#define IO_WriteOnly (QIODevice::OpenModeFlag)0x0002 // writable tqdevice -#define IO_ReadWrite (QIODevice::OpenModeFlag)0x0003 // read+write tqdevice -#define IO_Append (QIODevice::OpenModeFlag)0x0004 // append -#define IO_Truncate (QIODevice::OpenModeFlag)0x0008 // truncate tqdevice -#define IO_Translate (QIODevice::OpenModeFlag)0x0010 // translate CR+LF -#define IO_ModeMask (QIODevice::OpenModeFlag)0x00ff - -// IO tqdevice state - -#define IO_Open 0x1000 // tqdevice is open -#define IO_StateMask 0xf000 - -// IO tqdevice status - -#define IO_Ok 0 -#define IO_ReadError 1 // read error -#define IO_WriteError 2 // write error -#define IO_FatalError 3 // fatal unrecoverable error -#define IO_ResourceError 4 // resource limitation -#define IO_OpenError 5 // cannot open tqdevice -#define IO_ConnectError 5 // cannot connect to tqdevice -#define IO_AbortError 6 // abort error -#define IO_TimeOutError 7 // time out -#define IO_UnspecifiedError 8 // unspecified error - -class TQ_EXPORT TQIODevice : public QIODevice -{ -public: -#if defined(TQT_ABI_QT4) - typedef TQ_LLONG Offset; -#else - typedef TQ_ULONG Offset; -#endif - - TQIODevice() : QIODevice() {} - - inline int state() const { return isOpen() ? 0x1000 : 0; } - inline int mode() const { return (int) openMode(); } - inline int flags() const { return (int) openMode(); } - inline bool tqopen( int mode ) { return open((OpenModeFlag)mode); } - - inline Offset at() const { return pos(); } - inline bool at(Offset offset) { return seek(offset); } - inline Offset tqat() const { return pos(); } - inline bool tqat(Offset offset) { return seek(offset); } - -// virtual inline qint64 readBlock(char *data, quint64 maxlen) { return read(data, maxlen); } -// virtual inline qint64 writeBlock(const char *data, quint64 len) { return write(data, len); } -// virtual inline qint64 writeBlock(const QByteArray &data) { return write(data); } - inline qint64 readBlock(char *data, quint64 maxlen) { return read(data, maxlen); } - inline qint64 writeBlock(const char *data, quint64 len) { return write(data, len); } - inline qint64 writeBlock(const QByteArray &data) { return write(data); } - -// virtual inline qint64 readData ( char * data, qint64 maxSize ) { return readBlock(data, maxSize); } -// virtual inline qint64 writeData ( const char * data, qint64 maxSize ) { return writeBlock(data, maxSize); } - - inline int getch() { char c; return getChar(&c) ? int(uchar(c)) : -1; } - inline int putch(int c) { return putChar(char(c)) ? int(uchar(c)) : -1; } - inline int ungetch(int c) { ungetChar(uchar(c)); return c; } - virtual void flush() = 0; - - inline bool isDirectAccess() const { return !isSequential(); } - inline bool isSequentialAccess() const { return isSequential(); } - inline bool isCombinedAccess() const { return false; } - inline bool isBuffered() const { return true; } - inline bool isRaw() const { return false; } - inline bool isSynchronous() const { return true; } - inline bool isAsynchronous() const { return false; } - inline bool isTranslated() const { return (openMode() & Text) != 0; } - inline bool isInactive() const { return !isOpen(); } - -// inline bool open( int mode ) = 0; - -protected: - void setFlags( int f ) { setOpenMode((QIODevice::OpenModeFlag)f); } - void setType( int ) { printf("[WARNING] TQIODevice::setType() unimplemented\n\r"); } - void setMode( int f ) { setOpenMode((QIODevice::OpenModeFlag)f); } - void setState( int state ) { - switch (state) { - case (IO_Open): - QIODevice::open(openMode()); - break; - } - } - -public: - typedef int Status; - Status status() const { -#if !defined(QT_NO_QOBJECT) - const QFile *f = qobject_cast<const QFile *>(this); - if (f) return (int) f->error(); -#endif - return isOpen() ? 0 /* IO_Ok */ : 8 /* IO_UnspecifiedError */; - } - void resetStatus() { -#if !defined(QT_NO_QOBJECT) - QFile *f = qobject_cast<QFile *>(this); - if (f) f->unsetError(); -#endif - } - - void setqStatus( int ) { std::cout << "[WARNING] TQIODevice::setqStatus() UNIMPLEMENTED\n\r"; } - void resetqStatus() { resetStatus(); } - -protected: - friend class TQFile; - friend class TQIODeviceSource; - friend class TQImageIO; - friend class TQBuffer; - -public: - // Interoperability - static TQIODevice& convertFromQIODevice( QIODevice& qiod ); -}; - -// Interoperability -inline static TQIODevice& convertFromQIODevice( QIODevice& qiod ) { - return (*static_cast<TQIODevice*>(&qiod)); -} - -#else // USE_QT4 - -// IO tqdevice access types - -#define IO_Direct 0x0100 // direct access tqdevice -#define IO_Sequential 0x0200 // sequential access tqdevice -#define IO_Combined 0x0300 // combined direct/sequential -#define IO_TypeMask 0x0f00 - -// IO handling modes - -#define IO_Raw 0x0040 // raw access (not buffered) -#define IO_Async 0x0080 // asynchronous mode - -// IO tqdevice open modes - -#define IO_ReadOnly 0x0001 // readable tqdevice -#define IO_WriteOnly 0x0002 // writable tqdevice -#define IO_ReadWrite 0x0003 // read+write tqdevice -#define IO_Append 0x0004 // append -#define IO_Truncate 0x0008 // truncate tqdevice -#define IO_Translate 0x0010 // translate CR+LF -#define IO_ModeMask 0x00ff - -// IO tqdevice state - -#define IO_Open 0x1000 // tqdevice is open -#define IO_StateMask 0xf000 - -// IO tqdevice status - -#define IO_Ok 0 -#define IO_ReadError 1 // read error -#define IO_WriteError 2 // write error -#define IO_FatalError 3 // fatal unrecoverable error -#define IO_ResourceError 4 // resource limitation -#define IO_OpenError 5 // cannot open tqdevice -#define IO_ConnectError 5 // cannot connect to tqdevice -#define IO_AbortError 6 // abort error -#define IO_TimeOutError 7 // time out -#define IO_UnspecifiedError 8 // unspecified error - - -class TQ_EXPORT TQIODevice -{ -public: -#if defined(TQT_ABI_QT4) - typedef TQ_LLONG Offset; -#else - typedef TQ_ULONG Offset; -#endif - - TQIODevice(); - virtual ~TQIODevice(); - - int flags() const { return ioMode; } - int mode() const { return ioMode & IO_ModeMask; } - int state() const { return ioMode & IO_StateMask; } - - bool isDirectAccess() const { return ((ioMode & IO_Direct) == IO_Direct); } - bool isSequentialAccess() const { return ((ioMode & IO_Sequential) == IO_Sequential); } - bool isCombinedAccess() const { return ((ioMode & IO_Combined) == IO_Combined); } - bool isBuffered() const { return ((ioMode & IO_Raw) != IO_Raw); } - bool isRaw() const { return ((ioMode & IO_Raw) == IO_Raw); } - bool isSynchronous() const { return ((ioMode & IO_Async) != IO_Async); } - bool isAsynchronous() const { return ((ioMode & IO_Async) == IO_Async); } - bool isTranslated() const { return ((ioMode & IO_Translate) == IO_Translate); } - bool isReadable() const { return ((ioMode & IO_ReadOnly) == IO_ReadOnly); } - bool isWritable() const { return ((ioMode & IO_WriteOnly) == IO_WriteOnly); } - bool isReadWrite() const { return ((ioMode & IO_ReadWrite) == IO_ReadWrite); } - bool isInactive() const { return state() == 0; } - bool isOpen() const { return state() == IO_Open; } - - int status() const { return ioSt; } - void resetqStatus() { ioSt = IO_Ok; } - - virtual bool open( int mode ) = 0; - virtual void close() = 0; - virtual void flush() = 0; - - virtual Offset size() const = 0; - virtual Offset at() const; - virtual bool at( Offset ); - virtual bool atEnd() const; - bool reset() { return at(0); } - - virtual TQ_LONG readBlock( char *data, TQ_ULONG maxlen ) = 0; - virtual TQ_LONG writeBlock( const char *data, TQ_ULONG len ) = 0; - virtual TQ_LONG readLine( char *data, TQ_ULONG maxlen ); - TQ_LONG writeBlock( const TQByteArray& data ); - virtual TQByteArray readAll(); - - virtual int getch() = 0; - virtual int putch( int ) = 0; - virtual int ungetch( int ) = 0; - -protected: - void setFlags( int f ) { ioMode = f; } - void setType( int ); - void setMode( int ); - void setState( int ); - void setqStatus( int ); - Offset ioIndex; - -private: - int ioMode; - int ioSt; - -private: // Disabled copy constructor and operator= -#if defined(TQ_DISABLE_COPY) - TQIODevice( const TQIODevice & ); - TQIODevice &operator=( const TQIODevice & ); -#endif -}; - -#endif // USE_QT4 - -#endif // TQIODEVICE_H diff --git a/tqtinterface/qt4/src/tools/tqlibrary.cpp b/tqtinterface/qt4/src/tools/tqlibrary.cpp deleted file mode 100644 index 5236cd5..0000000 --- a/tqtinterface/qt4/src/tools/tqlibrary.cpp +++ /dev/null @@ -1,443 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQLibrary class -** -** Created : 000101 -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" -#include <private/tqlibrary_p.h> -#include <tqstringlist.h> -#include <tqfile.h> - -#ifndef TQT_NO_LIBRARY - -// uncomment this to get error messages -//#define TQT_DEBUG_COMPONENT 1 -// uncomment this to get error and success messages -//#define TQT_DEBUG_COMPONENT 2 - -#ifndef TQT_DEBUG_COMPONENT -# if defined(TQT_DEBUG) -# define TQT_DEBUG_COMPONENT 1 -# endif -#endif - -#if (defined(TQ_WS_WIN) && !defined(TQT_MAKEDLL)) \ - || (defined(TQ_OS_FREEBSD) && defined(TQ_CC_INTEL)) \ - || (defined(TQ_OS_IRIX) && defined(TQ_CC_GNU)) -#define TQT_NO_LIBRARY_UNLOAD -#endif - -TQLibraryPrivate::TQLibraryPrivate( TQLibrary *lib ) - : pHnd( 0 ), library( lib ) -{ -} - - -/*! - \class TQLibrary tqlibrary.h - \reentrant - \brief The TQLibrary class provides a wrapper for handling shared libraries. - - \mainclass - \ingroup plugins - - An instance of a TQLibrary object can handle a single shared - library and provide access to the functionality in the library in - a platform independent way. If the library is a component server, - TQLibrary provides access to the exported component and can - directly query this component for interfaces. - - TQLibrary ensures that the shared library is loaded and stays in - memory whilst it is in use. TQLibrary can also unload the library - on destruction and release unused resources. - - A typical use of TQLibrary is to resolve an exported symbol in a - shared object, and to call the function that this symbol - represents. This is called "explicit linking" in contrast to - "implicit linking", which is done by the link step in the build - process when linking an executable against a library. - - The following code snippet loads a library, resolves the symbol - "mysymbol", and calls the function if everything succeeded. If - something went wrong, e.g. the library file does not exist or the - symbol is not defined, the function pointer will be 0 and won't be - called. When the TQLibrary object is destroyed the library will be - unloaded, making all references to memory allocated in the library - invalid. - - \code - typedef void (*MyPrototype)(); - MyPrototype myFunction; - - TQLibrary myLib( "mylib" ); - myFunction = (MyPrototype) myLib.resolve( "mysymbol" ); - if ( myFunction ) { - myFunction(); - } - \endcode -*/ - -/*! - Creates a TQLibrary object for the shared library \a filename. The - library will be unloaded in the destructor. - - Note that \a filename does not need to include the (platform specific) - file extension, so calling - \code - TQLibrary lib( "mylib" ); - \endcode - is equivalent to calling - \code - TQLibrary lib( "mylib.dll" ); - \endcode - on Windows, and - \code - TQLibrary lib( "libmylib.so" ); - \endcode - on Unix. Specifying the extension is not recommended, since - doing so introduces a platform dependency. - - If \a filename does not include a path, the library loader will - look for the file in the platform specific search paths. - - \sa load() unload(), setAutoUnload() -*/ -TQLibrary::TQLibrary( const TQString& filename ) - : libfile( filename ), aunload( TRUE ) -{ - libfile.replace( '\\', '/' ); - d = new TQLibraryPrivate( this ); -} - -/*! - Deletes the TQLibrary object. - - The library will be unloaded if autoUnload() is TRUE (the - default), otherwise it stays in memory until the application - exits. - - \sa unload(), setAutoUnload() -*/ -TQLibrary::~TQLibrary() -{ - if ( autoUnload() ) - unload(); - - delete d; -} - -/*! - Returns the address of the exported symbol \a symb. The library is - loaded if necessary. The function returns 0 if the symbol could - not be resolved or the library could not be loaded. - - \code - typedef int (*avgProc)( int, int ); - - avgProc avg = (avgProc) library->resolve( "avg" ); - if ( avg ) - return avg( 5, 8 ); - else - return -1; - \endcode - - The symbol must be exported as a C-function from the library. This - requires the \c {extern "C"} notation if the library is compiled - with a C++ compiler. On Windows you also have to explicitly export - the function from the DLL using the \c {__declspec(dllexport)} - compiler directive. - - \code - extern "C" MY_EXPORT_MACRO int avg(int a, int b) - { - return (a + b) / 2; - } - \endcode - - with \c MY_EXPORT defined as - - \code - #ifdef TQ_WS_WIN - # define MY_EXPORT __declspec(dllexport) - #else - # define MY_EXPORT - #endif - \endcode - - On Darwin and Mac OS X this function uses code from dlcompat, part of the - OpenDarwin project. - - \legalese - - Copyright (c) 2002 Jorge Acereda and Peter O'Gorman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -void *TQLibrary::resolve( const char* symb ) -{ - if ( !d->pHnd ) - load(); - if ( !d->pHnd ) - return 0; - - void *address = d->resolveSymbol( symb ); - - return address; -} - -/*! - \overload - - Loads the library \a filename and returns the address of the - exported symbol \a symb. Note that like the constructor, \a - filename does not need to include the (platform specific) file - extension. The library remains loaded until the process exits. - - The function returns 0 if the symbol could not be resolved or the - library could not be loaded. - - This function is useful only if you want to resolve a single - symbol, e.g. a function pointer from a specific library once: - - \code - typedef void (*FunctionType)(); - static FunctionType *ptrFunction = 0; - static bool triedResolve = FALSE; - if ( !ptrFunction && !triedResolve ) - ptrFunction = TQLibrary::resolve( "mylib", "mysymb" ); - - if ( ptrFunction ) - ptrFunction(); - else - ... - \endcode - - If you want to resolve multiple symbols, use a TQLibrary object and - call the non-static version of resolve(). - - \sa resolve() -*/ -void *TQLibrary::resolve( const TQString &filename, const char *symb ) -{ - TQLibrary lib( filename ); - lib.setAutoUnload( FALSE ); - return lib.resolve( symb ); -} - -/*! - Returns TRUE if the library is loaded; otherwise returns FALSE. - - \sa unload() -*/ -bool TQLibrary::isLoaded() const -{ - return d->pHnd != 0; -} - -/*! - Loads the library. Since resolve() always calls this function - before resolving any symbols it is not necessary to call it - explicitly. In some situations you might want the library loaded - in advance, in which case you would use this function. - - On Darwin and Mac OS X this function uses code from dlcompat, part of the - OpenDarwin project. - - \legalese - - Copyright (c) 2002 Jorge Acereda and Peter O'Gorman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -bool TQLibrary::load() -{ - if (libfile.isEmpty()) - return FALSE; - return d->loadLibrary(); -} - -/*! - Unloads the library and returns TRUE if the library could be - unloaded; otherwise returns FALSE. - - This function is called by the destructor if autoUnload() is - enabled. - - \sa resolve() -*/ -bool TQLibrary::unload() -{ - if ( !d->pHnd ) - return TRUE; - -#if !defined(TQT_NO_LIBRARY_UNLOAD) - if ( !d->freeLibrary() ) { -# if defined(TQT_DEBUG_COMPONENT) - qWarning( "%s could not be unloaded", (const char*) TQFile::encodeName(library()) ); -# endif - return FALSE; - } - -# if defined(TQT_DEBUG_COMPONENT) && TQT_DEBUG_COMPONENT == 2 - qWarning( "%s has been unloaded", (const char*) TQFile::encodeName(library()) ); -# endif - d->pHnd = 0; -#endif - return TRUE; -} - -/*! - Returns TRUE if the library will be automatically unloaded when - this wrapper object is destructed; otherwise returns FALSE. The - default is TRUE. - - \sa setAutoUnload() -*/ -bool TQLibrary::autoUnload() const -{ - return (bool)aunload; -} - -/*! - If \a enabled is TRUE (the default), the wrapper object is set to - automatically unload the library upon destruction. If \a enabled - is FALSE, the wrapper object is not unloaded unless you explicitly - call unload(). - - \sa autoUnload() -*/ -void TQLibrary::setAutoUnload( bool enabled ) -{ - aunload = enabled; -} - -/*! - Returns the filename of the shared library this TQLibrary object - handles, including the platform specific file extension. - - For example: - \code - TQLibrary lib( "mylib" ); - TQString str = lib.library(); - \endcode - will set \e str to "mylib.dll" on Windows, and "libmylib.so" on Linux. -*/ -TQString TQLibrary::library() const -{ - if ( libfile.isEmpty() ) - return libfile; - - TQString filename = libfile; - -#if defined(TQ_WS_WIN) - if ( filename.findRev( '.' ) <= filename.findRev( '/' ) ) - filename += ".dll"; -#else - TQStringList filters = ""; -#ifdef TQ_OS_MACX - filters << ".so"; - filters << ".bundle"; - filters << ".dylib"; //the last one is also the default one.. -#elif defined(TQ_OS_HPUX) - filters << ".sl"; -#else - filters << ".so"; -#endif - for(TQStringList::Iterator it = filters.begin(); TRUE; ) { - TQString filter = (*it); - ++it; - - if(TQFile::exists(filename + filter)) { - filename += filter; - break; - } else if(!filter.isEmpty()) { - TQString tmpfilename = filename; - const int x = tmpfilename.findRev( "/" ); - if ( x != -1 ) { - TQString path = tmpfilename.left( x + 1 ); - TQString file = tmpfilename.right( tmpfilename.length() - x - 1 ); - tmpfilename = TQString( "%1lib%2" ).arg( path ).arg( file ); - } else { - tmpfilename = TQString( "lib%1" ).arg( filename ); - } - if ( !filename.contains(".so") ) - tmpfilename += filter; - if(TQFile::exists(tmpfilename) || it == filters.end()) { - filename = tmpfilename; - break; - } - } - } -#endif - return filename; -} -#endif //TQT_NO_LIBRARY diff --git a/tqtinterface/qt4/src/tools/tqlibrary.h b/tqtinterface/qt4/src/tools/tqlibrary.h deleted file mode 100644 index 7d3f05a..0000000 --- a/tqtinterface/qt4/src/tools/tqlibrary.h +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** -** -** Definition of TQLibrary class -** -** Created : 000101 -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQLIBRARY_H -#define TQLIBRARY_H - -#ifndef TQT_H -#include "tqstring.h" -#endif // TQT_H - -#ifndef TQT_NO_LIBRARY - -class TQLibraryPrivate; - -class TQ_EXPORT TQLibrary -{ -public: - TQLibrary( const TQString& filename ); - virtual ~TQLibrary(); - - void *resolve( const char* ); - static void *resolve( const TQString &filename, const char * ); - - bool load(); - virtual bool unload(); - bool isLoaded() const; - - bool autoUnload() const; - void setAutoUnload( bool enable ); - - TQString library() const; - -private: - TQLibraryPrivate *d; - - TQString libfile; - uint aunload : 1; - -private: // Disabled copy constructor and operator= -#if defined(TQ_DISABLE_COPY) - TQLibrary( const TQLibrary & ); - TQLibrary &operator=( const TQLibrary & ); -#endif -}; - -#define TQ_DEFINED_TQLIBRARY -#include "tqwinexport.h" -#endif //TQT_NO_LIBRARY -#endif //TQLIBRARY_H diff --git a/tqtinterface/qt4/src/tools/tqlibrary_p.h b/tqtinterface/qt4/src/tools/tqlibrary_p.h deleted file mode 100644 index dbd18a8..0000000 --- a/tqtinterface/qt4/src/tools/tqlibrary_p.h +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Definition of an internal TQLibrary class -** -** Created : 000101 -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQLIBRARY_P_H -#define TQLIBRARY_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of the TQLibrary class. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// -// - -#include "tqlibrary.h" - -#ifndef TQT_NO_LIBRARY - -#ifndef TQT_H -#include "tqwindowdefs.h" -#endif // TQT_H - -class TQLibraryPrivate -{ -public: - TQLibraryPrivate( TQLibrary *lib ); - -#ifdef TQ_WS_WIN - HINSTANCE pHnd; -#else - void *pHnd; -#endif - - bool loadLibrary(); - bool freeLibrary(); - void *resolveSymbol( const char * ); - -private: - TQLibrary *library; -}; - -#endif // TQT_NO_LIBRARY -#endif // TQLIBRARY_P_H diff --git a/tqtinterface/qt4/src/tools/tqlibrary_unix.cpp b/tqtinterface/qt4/src/tools/tqlibrary_unix.cpp deleted file mode 100644 index 271a897..0000000 --- a/tqtinterface/qt4/src/tools/tqlibrary_unix.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQLibraryPrivate class -** -** Created : 000101 -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" -#include "private/tqlibrary_p.h" - -#ifndef TQT_NO_LIBRARY - -#if defined(TQT_AOUT_UNDERSCORE) -#include <string.h> -#endif - -/* - The platform dependent implementations of - - loadLibrary - - freeLibrary - - resolveSymbol - - It's not too hard to guess what the functions do. -*/ - -#if defined(TQT_HPUX_LD) // for HP-UX < 11.x and 32 bit - -bool TQLibraryPrivate::loadLibrary() -{ - if ( pHnd ) - return TRUE; - - TQString filename = library->library(); - - pHnd = (void*)shl_load( filename.latin1(), BIND_DEFERRED | BIND_NONFATAL | DYNAMIC_PATH, 0 ); -#if defined(TQT_DEBUG) || defined(TQT_DEBUG_COMPONENT) - if ( !pHnd ) - qWarning( "%s: failed to load library!", filename.latin1() ); -#endif - return pHnd != 0; -} - -bool TQLibraryPrivate::freeLibrary() -{ - if ( !pHnd ) - return TRUE; - - if ( shl_unload( (shl_t)pHnd ) ) { -#if defined(TQT_DEBUG) || defined(TQT_DEBUG_COMPONENT) - TQString filename = library->library(); - qWarning( "%s: Failed to unload library!", filename.latin1() ); -#endif - return FALSE; - } - pHnd = 0; - return TRUE; -} - -void* TQLibraryPrivate::resolveSymbol( const char* symbol ) -{ - if ( !pHnd ) - return 0; - - void* address = 0; - if ( shl_findsym( (shl_t*)&pHnd, symbol, TYPE_UNDEFINED, &address ) < 0 ) { -#if defined(TQT_DEBUG_COMPONENT) - TQString filename = library->library(); - qWarning( "%s: couldn't resolve symbol \"%s\"", filename.latin1(), symbol ); -#endif - } - return address; -} - -#else // POSIX -#include <dlfcn.h> -#ifndef DL_PREFIX //for mac dlcompat -# define DL_PREFIX(x) x -#endif - -bool TQLibraryPrivate::loadLibrary() -{ - if ( pHnd ) - return TRUE; - - TQString filename = library->library(); - - pHnd = DL_PREFIX(dlopen)( filename.latin1(), RTLD_LAZY ); -#if defined(TQT_DEBUG) || defined(TQT_DEBUG_COMPONENT) - if ( !pHnd ) - qWarning( "%s", DL_PREFIX(dlerror)() ); -#endif - return pHnd != 0; -} - -bool TQLibraryPrivate::freeLibrary() -{ - if ( !pHnd ) - return TRUE; - - if ( DL_PREFIX(dlclose)( pHnd ) ) { -#if defined(TQT_DEBUG) || defined(TQT_DEBUG_COMPONENT) - qWarning( "%s", DL_PREFIX(dlerror)() ); -#endif - return FALSE; - } - - pHnd = 0; - return TRUE; -} - -void* TQLibraryPrivate::resolveSymbol( const char* symbol ) -{ - if ( !pHnd ) - return 0; - -#if defined(TQT_AOUT_UNDERSCORE) - // older a.out systems add an underscore in front of symbols - char* undrscr_symbol = new char[strlen(symbol)+2]; - undrscr_symbol[0] = '_'; - strcpy(undrscr_symbol+1, symbol); - void* address = DL_PREFIX(dlsym)( pHnd, undrscr_symbol ); - delete [] undrscr_symbol; -#else - void* address = DL_PREFIX(dlsym)( pHnd, symbol ); -#endif -#if defined(TQT_DEBUG_COMPONENT) - const char* error = DL_PREFIX(dlerror)(); - if ( error ) - qWarning( "%s", error ); -#endif - return address; -} - -#endif // POSIX - -#endif diff --git a/tqtinterface/qt4/src/tools/tqlocale.cpp b/tqtinterface/qt4/src/tools/tqlocale.cpp deleted file mode 100644 index e91cab8..0000000 --- a/tqtinterface/qt4/src/tools/tqlocale.cpp +++ /dev/null @@ -1,6322 +0,0 @@ -/**************************************************************************** -** -** Implementation of the TQLocale class -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include <sys/types.h> -#include <ctype.h> -#include <float.h> -#include <limits.h> -#include <math.h> -#include <stdlib.h> - -#include "tqlocale.h" -#include "tqlocale_p.h" -#include "tqnamespace.h" - -#ifdef TQT_TQLOCALE_USES_FCVT -# include <tqmutex.h> -# include <private/tqmutexpool_p.h> -#endif - -#if defined (TQ_OS_WIN) -# include <windows.h> -# undef NAN // we want to use our fallback on Windows -# undef INFINITY -#endif - -#ifdef TQ_OS_LINUX -# include <fenv.h> -#endif - -#if !defined( TQWS ) && defined( TQ_OS_MAC ) -# include <Carbon/Carbon.h> -#endif - -#if defined (TQ_OS_SOLARIS) -# include <ieeefp.h> -#endif - -#if defined (TQ_OS_OSF) && (defined(__DECC) || defined(__DECCXX)) -# define INFINITY DBL_INFINITY -# define NAN DBL_TQNAN -#endif - -#if (defined(TQ_CC_GNU) && defined(TQ_OS_WIN)) || __GNUC__ == 4 || defined(TQT_TQLOCALE_NEEDS_VOLATILE) -# define NEEDS_VOLATILE volatile -#else -# define NEEDS_VOLATILE -#endif - -enum { - LittleEndian, - BigEndian - -#ifdef TQ_BYTE_ORDER -# if TQ_BYTE_ORDER == TQ_BIG_ENDIAN - , ByteOrder = BigEndian -# elif TQ_BYTE_ORDER == TQ_LITTLE_ENDIAN - , ByteOrder = LittleEndian -# else -# error "undefined byte order" -# endif -}; -#else -}; -static const unsigned int one = 1; -static const bool ByteOrder = ((*((unsigned char *) &one) == 0) ? BigEndian : LittleEndian); -#endif - -#if !defined(INFINITY) -static const unsigned char be_inf_bytes[] = { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 }; -static const unsigned char le_inf_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f }; -static inline double inf() -{ - return (ByteOrder == BigEndian ? - *((const double *) be_inf_bytes) : - *((const double *) le_inf_bytes)); -} -# define INFINITY (::inf()) -#endif - -#if !defined(NAN) -static const unsigned char be_nan_bytes[] = { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 }; -static const unsigned char le_nan_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f }; -static inline double nan() -{ - return (ByteOrder == BigEndian ? - *((const double *) be_nan_bytes) : - *((const double *) le_nan_bytes)); -} -# define NAN (::nan()) -#endif - -// We can't rely on -NAN, since all operations on a NAN should return a NAN. -static double be_neg_nan; -static double le_neg_nan; -static const unsigned char be_neg_nan_bytes[] = { 0xff, 0xf8, 0, 0, 0, 0, 0, 0 }; -static const unsigned char le_neg_nan_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf8, 0xff }; -static bool neg_nan_init = false; - -static inline double negNan() -{ - if (!neg_nan_init) - { - memcpy(&be_neg_nan,be_neg_nan_bytes,sizeof(be_neg_nan_bytes)); - memcpy(&le_neg_nan,le_neg_nan_bytes,sizeof(le_neg_nan_bytes)); - neg_nan_init = true; - } - return (ByteOrder == BigEndian ? - be_neg_nan : - le_neg_nan); - -} - -// Sizes as defined by the ISO C99 standard - fallback -#ifndef LLONG_MAX -# define LLONG_MAX TQ_INT64_C(9223372036854775807) -#endif -#ifndef LLONG_MIN -# define LLONG_MIN (-LLONG_MAX - TQ_INT64_C(1)) -#endif -#ifndef ULLONG_MAX -# define ULLONG_MAX TQ_UINT64_C(0xffffffffffffffff) -#endif - -#ifndef TQT_TQLOCALE_USES_FCVT -static char *qdtoa(double d, int mode, int ndigits, int *decpt, - int *sign, char **rve, char **digits_str); -static char *_qdtoa(double d, int mode, int ndigits, int *decpt, - int *sign, char **rve, char **digits_str); -static double qstrtod(const char *s00, char const **se, bool *ok); -#endif -static TQ_LLONG qstrtoll(const char *nptr, const char **endptr, register int base, bool *ok); -static TQ_ULLONG qstrtoull(const char *nptr, const char **endptr, register int base, bool *ok); - -static inline bool compareBits(double d1, double d2) -{ - return memcmp((const char*)&d1, (const char*)&d2, sizeof(double)) == 0; -} - -static inline bool qIsInf(double d) -{ - return compareBits(d, INFINITY) || compareBits(d, -INFINITY); -} - -static inline bool qIsNan(double d) -{ - return compareBits(d, NAN) || compareBits(d, negNan()); -} - -static const uint locale_index[] = { - 0, // unused - 0, // C - 0, // Abkhazian - 0, // Afan - 0, // Afar - 1, // Afrikaans - 2, // Albanian - 0, // Amharic - 3, // Arabic - 19, // Armenian - 0, // Assamese - 0, // Aymara - 20, // Azerbaijani - 0, // Bashkir - 21, // Basque - 22, // Bengali - 0, // Bhutani - 0, // Bihari - 0, // Bislama - 0, // Breton - 23, // Bulgarian - 0, // Burmese - 24, // Byelorussian - 0, // Cambodian - 25, // Catalan - 26, // Chinese - 0, // Corsican - 31, // Croatian - 32, // Czech - 33, // Danish - 34, // Dutch - 36, // English - 0, // Esperanto - 48, // Estonian - 49, // Faroese - 0, // Fiji - 50, // Finnish - 51, // French - 0, // Frisian - 0, // Gaelic - 57, // Galician - 58, // Georgian - 59, // German - 64, // Greek - 0, // Greenlandic - 0, // Guarani - 65, // Gujarati - 0, // Hausa - 66, // Hebrew - 67, // Hindi - 68, // Hungarian - 69, // Icelandic - 70, // Indonesian - 0, // Interlingua - 0, // Interlingue - 0, // Inuktitut - 0, // Inupiak - 0, // Irish - 71, // Italian - 73, // Japanese - 0, // Javanese - 74, // Kannada - 0, // Kashmiri - 75, // Kazakh - 0, // Kinyarwanda - 76, // Kirghiz - 77, // Korean - 0, // Kurdish - 0, // Kurundi - 0, // Laothian - 0, // Latin - 78, // Latvian - 0, // Lingala - 79, // Lithuanian - 80, // Macedonian - 0, // Malagasy - 81, // Malay - 0, // Malayalam - 0, // Maltese - 0, // Maori - 83, // Marathi - 0, // Moldavian - 84, // Mongolian - 0, // Nauru - 0, // Nepali - 85, // Norwegian - 0, // Occitan - 0, // Oriya - 0, // Pashto - 86, // Persian - 87, // Polish - 88, // Portuguese - 90, // Punjabi - 0, // Quechua - 0, // RhaetoRomance - 91, // Romanian - 92, // Russian - 0, // Samoan - 0, // Sangho - 93, // Sanskrit - 0, // Serbian - 0, // SerboCroatian - 0, // Sesotho - 0, // Setswana - 0, // Shona - 0, // Sindhi - 0, // Singhalese - 0, // Siswati - 94, // Slovak - 95, // Slovenian - 0, // Somali - 96, // Spanish - 0, // Sundanese - 115, // Swahili - 116, // Swedish - 0, // Tagalog - 0, // Tajik - 118, // Tamil - 0, // Tatar - 119, // Telugu - 120, // Thai - 0, // Tibetan - 0, // Tigrinya - 0, // Tonga - 0, // Tsonga - 121, // Turkish - 0, // Turkmen - 0, // Twi - 0, // Uigur - 122, // Ukrainian - 123, // Urdu - 124, // Uzbek - 125, // Vietnamese - 0, // Volapuk - 0, // Welsh - 0, // Wolof - 0, // Xhosa - 0, // Yiddish - 0, // Yoruba - 0, // Zhuang - 0, // Zulu - 0 // trailing 0 -}; - -static const TQLocalePrivate locale_data[] = { -// lang terr dec group list prcnt zero minus exp - { 1, 0, 46, 44, 59, 37, 48, 45, 101 }, // C/AnyCountry - { 5, 195, 46, 44, 44, 37, 48, 45, 101 }, // Afrikaans/SouthAfrica - { 6, 2, 44, 46, 59, 37, 48, 45, 101 }, // Albanian/Albania - { 8, 186, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/SaudiArabia - { 8, 3, 46, 44, 59, 37, 48, 45, 101 }, // Arabic/Algeria - { 8, 17, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/Bahrain - { 8, 64, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/Egypt - { 8, 103, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/Iraq - { 8, 109, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/Jordan - { 8, 115, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/Kuwait - { 8, 119, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/Lebanon - { 8, 122, 46, 44, 59, 37, 48, 45, 101 }, // Arabic/LibyanArabJamahiriya - { 8, 145, 46, 44, 59, 37, 48, 45, 101 }, // Arabic/Morocco - { 8, 162, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/Oman - { 8, 175, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/Qatar - { 8, 207, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/SyrianArabRepublic - { 8, 216, 46, 44, 59, 37, 48, 45, 101 }, // Arabic/Tunisia - { 8, 223, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/UnitedArabEmirates - { 8, 237, 46, 44, 59, 37, 1632, 45, 101 }, // Arabic/Yemen - { 9, 11, 46, 44, 44, 37, 48, 45, 101 }, // Armenian/Armenia - { 12, 15, 44, 160, 59, 37, 48, 45, 101 }, // Azerbaijani/Azerbaijan - { 14, 197, 44, 46, 59, 37, 48, 45, 101 }, // Basque/Spain - { 15, 100, 46, 44, 59, 37, 48, 45, 101 }, // Bengali/India - { 20, 33, 44, 160, 59, 37, 48, 45, 101 }, // Bulgarian/Bulgaria - { 22, 20, 44, 160, 59, 37, 48, 45, 101 }, // Byelorussian/Belarus - { 24, 197, 44, 46, 59, 37, 48, 45, 101 }, // Catalan/Spain - { 25, 44, 46, 44, 44, 37, 48, 45, 101 }, // Chinese/China - { 25, 97, 46, 44, 44, 37, 48, 45, 101 }, // Chinese/HongKong - { 25, 126, 46, 44, 44, 37, 48, 45, 101 }, // Chinese/Macau - { 25, 190, 46, 44, 44, 37, 48, 45, 101 }, // Chinese/Singapore - { 25, 208, 46, 44, 44, 37, 48, 45, 101 }, // Chinese/Taiwan - { 27, 54, 44, 46, 59, 37, 48, 45, 101 }, // Croatian/Croatia - { 28, 57, 44, 160, 59, 37, 48, 45, 101 }, // Czech/CzechRepublic - { 29, 58, 44, 46, 59, 37, 48, 45, 101 }, // Danish/Denmark - { 30, 151, 44, 46, 59, 37, 48, 45, 101 }, // Dutch/Netherlands - { 30, 21, 44, 46, 59, 37, 48, 45, 101 }, // Dutch/Belgium - { 31, 225, 46, 44, 44, 37, 48, 45, 101 }, // English/UnitedStates - { 31, 13, 46, 44, 44, 37, 48, 45, 101 }, // English/Australia - { 31, 22, 46, 44, 59, 37, 48, 45, 101 }, // English/Belize - { 31, 38, 46, 44, 44, 37, 48, 45, 101 }, // English/Canada - { 31, 104, 46, 44, 44, 37, 48, 45, 101 }, // English/Ireland - { 31, 107, 46, 44, 44, 37, 48, 45, 101 }, // English/Jamaica - { 31, 154, 46, 44, 44, 37, 48, 45, 101 }, // English/NewZealand - { 31, 170, 46, 44, 44, 37, 48, 45, 101 }, // English/Philippines - { 31, 195, 46, 44, 44, 37, 48, 45, 101 }, // English/SouthAfrica - { 31, 215, 46, 44, 59, 37, 48, 45, 101 }, // English/TrinidadAndTobago - { 31, 224, 46, 44, 44, 37, 48, 45, 101 }, // English/UnitedKingdom - { 31, 240, 46, 44, 44, 37, 48, 45, 101 }, // English/Zimbabwe - { 33, 68, 44, 160, 59, 37, 48, 45, 101 }, // Estonian/Estonia - { 34, 71, 44, 46, 59, 37, 48, 45, 101 }, // Faroese/FaroeIslands - { 36, 73, 44, 160, 59, 37, 48, 45, 101 }, // Finnish/Finland - { 37, 74, 44, 160, 59, 37, 48, 45, 101 }, // French/France - { 37, 21, 44, 46, 59, 37, 48, 45, 101 }, // French/Belgium - { 37, 38, 44, 160, 59, 37, 48, 45, 101 }, // French/Canada - { 37, 125, 44, 160, 59, 37, 48, 45, 101 }, // French/Luxembourg - { 37, 142, 44, 160, 59, 37, 48, 45, 101 }, // French/Monaco - { 37, 206, 46, 39, 59, 37, 48, 45, 101 }, // French/Switzerland - { 40, 197, 44, 46, 44, 37, 48, 45, 101 }, // Galician/Spain - { 41, 81, 44, 160, 59, 37, 48, 45, 101 }, // Georgian/Georgia - { 42, 82, 44, 46, 59, 37, 48, 45, 101 }, // German/Germany - { 42, 14, 44, 46, 59, 37, 48, 45, 101 }, // German/Austria - { 42, 123, 46, 39, 59, 37, 48, 45, 101 }, // German/Liechtenstein - { 42, 125, 44, 46, 59, 37, 48, 45, 101 }, // German/Luxembourg - { 42, 206, 46, 39, 59, 37, 48, 45, 101 }, // German/Switzerland - { 43, 85, 44, 46, 59, 37, 48, 45, 101 }, // Greek/Greece - { 46, 100, 46, 44, 44, 37, 2790, 45, 101 }, // Gujarati/India - { 48, 105, 46, 44, 44, 37, 48, 45, 101 }, // Hebrew/Israel - { 49, 100, 46, 44, 44, 37, 48, 45, 101 }, // Hindi/India - { 50, 98, 44, 160, 59, 37, 48, 45, 101 }, // Hungarian/Hungary - { 51, 99, 44, 46, 59, 37, 48, 45, 101 }, // Icelandic/Iceland - { 52, 101, 44, 46, 59, 37, 48, 45, 101 }, // Indonesian/Indonesia - { 58, 106, 44, 46, 59, 37, 48, 45, 101 }, // Italian/Italy - { 58, 206, 46, 39, 59, 37, 48, 45, 101 }, // Italian/Switzerland - { 59, 108, 46, 44, 44, 37, 48, 45, 101 }, // Japanese/Japan - { 61, 100, 46, 44, 44, 37, 3302, 45, 101 }, // Kannada/India - { 63, 110, 44, 160, 59, 37, 48, 45, 101 }, // Kazakh/Kazakhstan - { 65, 116, 44, 160, 59, 37, 48, 45, 101 }, // Kirghiz/Kyrgyzstan - { 66, 114, 46, 44, 44, 37, 48, 45, 101 }, // Korean/RepublicOfKorea - { 71, 118, 44, 160, 59, 37, 48, 45, 101 }, // Latvian/Latvia - { 73, 124, 44, 46, 59, 37, 48, 45, 101 }, // Lithuanian/Lithuania - { 74, 127, 44, 46, 59, 37, 48, 45, 101 }, // Macedonian/Macedonia - { 76, 130, 44, 46, 59, 37, 48, 45, 101 }, // Malay/Malaysia - { 76, 32, 44, 46, 59, 37, 48, 45, 101 }, // Malay/BruneiDarussalam - { 80, 100, 46, 44, 44, 37, 2406, 45, 101 }, // Marathi/India - { 82, 143, 44, 160, 59, 37, 48, 45, 101 }, // Mongolian/Mongolia - { 85, 161, 44, 160, 59, 37, 48, 45, 101 }, // Norwegian/Norway - { 89, 102, 46, 44, 59, 37, 1776, 45, 101 }, // Persian/Iran - { 90, 172, 44, 160, 59, 37, 48, 45, 101 }, // Polish/Poland - { 91, 173, 44, 46, 59, 37, 48, 45, 101 }, // Portuguese/Portugal - { 91, 30, 44, 46, 59, 37, 48, 45, 101 }, // Portuguese/Brazil - { 92, 100, 46, 44, 44, 37, 2662, 45, 101 }, // Punjabi/India - { 95, 177, 44, 46, 59, 37, 48, 45, 101 }, // Romanian/Romania - { 96, 178, 44, 160, 59, 37, 48, 45, 101 }, // Russian/RussianFederation - { 99, 100, 46, 44, 44, 37, 2406, 45, 101 }, // Sanskrit/India - { 108, 191, 44, 160, 59, 37, 48, 45, 101 }, // Slovak/Slovakia - { 109, 192, 44, 46, 59, 37, 48, 45, 101 }, // Slovenian/Slovenia - { 111, 197, 44, 46, 59, 37, 48, 45, 101 }, // Spanish/Spain - { 111, 10, 44, 46, 44, 37, 48, 45, 101 }, // Spanish/Argentina - { 111, 26, 44, 46, 44, 37, 48, 45, 101 }, // Spanish/Bolivia - { 111, 43, 44, 46, 44, 37, 48, 45, 101 }, // Spanish/Chile - { 111, 47, 44, 46, 44, 37, 48, 45, 101 }, // Spanish/Colombia - { 111, 52, 44, 46, 44, 37, 48, 45, 101 }, // Spanish/CostaRica - { 111, 61, 46, 44, 44, 37, 48, 45, 101 }, // Spanish/DominicanRepublic - { 111, 63, 44, 46, 44, 37, 48, 45, 101 }, // Spanish/Ecuador - { 111, 65, 46, 44, 44, 37, 48, 45, 101 }, // Spanish/ElSalvador - { 111, 90, 46, 44, 44, 37, 48, 45, 101 }, // Spanish/Guatemala - { 111, 96, 46, 44, 44, 37, 48, 45, 101 }, // Spanish/Honduras - { 111, 139, 46, 44, 44, 37, 48, 45, 101 }, // Spanish/Mexico - { 111, 155, 46, 44, 44, 37, 48, 45, 101 }, // Spanish/Nicaragua - { 111, 166, 46, 44, 44, 37, 48, 45, 101 }, // Spanish/Panama - { 111, 168, 44, 46, 44, 37, 48, 45, 101 }, // Spanish/Paraguay - { 111, 169, 46, 44, 44, 37, 48, 45, 101 }, // Spanish/Peru - { 111, 174, 46, 44, 44, 37, 48, 45, 101 }, // Spanish/PuertoRico - { 111, 227, 44, 46, 44, 37, 48, 45, 101 }, // Spanish/Uruguay - { 111, 231, 44, 46, 44, 37, 48, 45, 101 }, // Spanish/Venezuela - { 113, 111, 46, 44, 44, 37, 48, 45, 101 }, // Swahili/Kenya - { 114, 205, 44, 160, 59, 37, 48, 45, 101 }, // Swedish/Sweden - { 114, 73, 44, 160, 59, 37, 48, 45, 101 }, // Swedish/Finland - { 117, 100, 46, 44, 44, 37, 48, 45, 101 }, // Tamil/India - { 119, 100, 46, 44, 44, 37, 3174, 45, 101 }, // Telugu/India - { 120, 211, 46, 44, 44, 37, 3664, 45, 101 }, // Thai/Thailand - { 125, 217, 44, 46, 59, 37, 48, 45, 101 }, // Turkish/Turkey - { 129, 222, 44, 160, 59, 37, 48, 45, 101 }, // Ukrainian/Ukraine - { 130, 163, 46, 44, 59, 37, 1776, 45, 101 }, // Urdu/Pakistan - { 131, 228, 44, 160, 59, 37, 48, 45, 101 }, // Uzbek/Uzbekistan - { 132, 232, 44, 46, 44, 37, 48, 45, 101 }, // Vietnamese/VietNam - { 0, 0, 0, 0, 0, 0, 0, 0, 0 } // trailing 0s -}; - -static const char language_name_list[] = -"Default\0" -"C\0" -"Abkhazian\0" -"Afan\0" -"Afar\0" -"Afrikaans\0" -"Albanian\0" -"Amharic\0" -"Arabic\0" -"Armenian\0" -"Assamese\0" -"Aymara\0" -"Azerbaijani\0" -"Bashkir\0" -"Basque\0" -"Bengali\0" -"Bhutani\0" -"Bihari\0" -"Bislama\0" -"Breton\0" -"Bulgarian\0" -"Burmese\0" -"Byelorussian\0" -"Cambodian\0" -"Catalan\0" -"Chinese\0" -"Corsican\0" -"Croatian\0" -"Czech\0" -"Danish\0" -"Dutch\0" -"English\0" -"Esperanto\0" -"Estonian\0" -"Faroese\0" -"Fiji\0" -"Finnish\0" -"French\0" -"Frisian\0" -"Gaelic\0" -"Galician\0" -"Georgian\0" -"German\0" -"Greek\0" -"Greenlandic\0" -"Guarani\0" -"Gujarati\0" -"Hausa\0" -"Hebrew\0" -"Hindi\0" -"Hungarian\0" -"Icelandic\0" -"Indonesian\0" -"Interlingua\0" -"Interlingue\0" -"Inuktitut\0" -"Inupiak\0" -"Irish\0" -"Italian\0" -"Japanese\0" -"Javanese\0" -"Kannada\0" -"Kashmiri\0" -"Kazakh\0" -"Kinyarwanda\0" -"Kirghiz\0" -"Korean\0" -"Kurdish\0" -"Kurundi\0" -"Laothian\0" -"Latin\0" -"Latvian\0" -"Lingala\0" -"Lithuanian\0" -"Macedonian\0" -"Malagasy\0" -"Malay\0" -"Malayalam\0" -"Maltese\0" -"Maori\0" -"Marathi\0" -"Moldavian\0" -"Mongolian\0" -"Nauru\0" -"Nepali\0" -"Norwegian\0" -"Occitan\0" -"Oriya\0" -"Pashto\0" -"Persian\0" -"Polish\0" -"Portuguese\0" -"Punjabi\0" -"Quechua\0" -"RhaetoRomance\0" -"Romanian\0" -"Russian\0" -"Samoan\0" -"Sangho\0" -"Sanskrit\0" -"Serbian\0" -"SerboCroatian\0" -"Sesotho\0" -"Setswana\0" -"Shona\0" -"Sindhi\0" -"Singhalese\0" -"Siswati\0" -"Slovak\0" -"Slovenian\0" -"Somali\0" -"Spanish\0" -"Sundanese\0" -"Swahili\0" -"Swedish\0" -"Tagalog\0" -"Tajik\0" -"Tamil\0" -"Tatar\0" -"Telugu\0" -"Thai\0" -"Tibetan\0" -"Tigrinya\0" -"Tonga\0" -"Tsonga\0" -"Turkish\0" -"Turkmen\0" -"Twi\0" -"Uigur\0" -"Ukrainian\0" -"Urdu\0" -"Uzbek\0" -"Vietnamese\0" -"Volapuk\0" -"Welsh\0" -"Wolof\0" -"Xhosa\0" -"Yiddish\0" -"Yoruba\0" -"Zhuang\0" -"Zulu\0"; - -static const uint language_name_index[] = { - 0,// Unused - 8,// C - 10,// Abkhazian - 20,// Afan - 25,// Afar - 30,// Afrikaans - 40,// Albanian - 49,// Amharic - 57,// Arabic - 64,// Armenian - 73,// Assamese - 82,// Aymara - 89,// Azerbaijani - 101,// Bashkir - 109,// Basque - 116,// Bengali - 124,// Bhutani - 132,// Bihari - 139,// Bislama - 147,// Breton - 154,// Bulgarian - 164,// Burmese - 172,// Byelorussian - 185,// Cambodian - 195,// Catalan - 203,// Chinese - 211,// Corsican - 220,// Croatian - 229,// Czech - 235,// Danish - 242,// Dutch - 248,// English - 256,// Esperanto - 266,// Estonian - 275,// Faroese - 283,// Fiji - 288,// Finnish - 296,// French - 303,// Frisian - 311,// Gaelic - 318,// Galician - 327,// Georgian - 336,// German - 343,// Greek - 349,// Greenlandic - 361,// Guarani - 369,// Gujarati - 378,// Hausa - 384,// Hebrew - 391,// Hindi - 397,// Hungarian - 407,// Icelandic - 417,// Indonesian - 428,// Interlingua - 440,// Interlingue - 452,// Inuktitut - 462,// Inupiak - 470,// Irish - 476,// Italian - 484,// Japanese - 493,// Javanese - 502,// Kannada - 510,// Kashmiri - 519,// Kazakh - 526,// Kinyarwanda - 538,// Kirghiz - 546,// Korean - 553,// Kurdish - 561,// Kurundi - 569,// Laothian - 578,// Latin - 584,// Latvian - 592,// Lingala - 600,// Lithuanian - 611,// Macedonian - 622,// Malagasy - 631,// Malay - 637,// Malayalam - 647,// Maltese - 655,// Maori - 661,// Marathi - 669,// Moldavian - 679,// Mongolian - 689,// Nauru - 695,// Nepali - 702,// Norwegian - 712,// Occitan - 720,// Oriya - 726,// Pashto - 733,// Persian - 741,// Polish - 748,// Portuguese - 759,// Punjabi - 767,// Quechua - 775,// RhaetoRomance - 789,// Romanian - 798,// Russian - 806,// Samoan - 813,// Sangho - 820,// Sanskrit - 829,// Serbian - 837,// SerboCroatian - 851,// Sesotho - 859,// Setswana - 868,// Shona - 874,// Sindhi - 881,// Singhalese - 892,// Siswati - 900,// Slovak - 907,// Slovenian - 917,// Somali - 924,// Spanish - 932,// Sundanese - 942,// Swahili - 950,// Swedish - 958,// Tagalog - 966,// Tajik - 972,// Tamil - 978,// Tatar - 984,// Telugu - 991,// Thai - 996,// Tibetan - 1004,// Tigrinya - 1013,// Tonga - 1019,// Tsonga - 1026,// Turkish - 1034,// Turkmen - 1042,// Twi - 1046,// Uigur - 1052,// Ukrainian - 1062,// Urdu - 1067,// Uzbek - 1073,// Vietnamese - 1084,// Volapuk - 1092,// Welsh - 1098,// Wolof - 1104,// Xhosa - 1110,// Yiddish - 1118,// Yoruba - 1125,// Zhuang - 1132// Zulu -}; - -static const char country_name_list[] = -"Default\0" -"Afghanistan\0" -"Albania\0" -"Algeria\0" -"AmericanSamoa\0" -"Andorra\0" -"Angola\0" -"Anguilla\0" -"Antarctica\0" -"AntiguaAndBarbuda\0" -"Argentina\0" -"Armenia\0" -"Aruba\0" -"Australia\0" -"Austria\0" -"Azerbaijan\0" -"Bahamas\0" -"Bahrain\0" -"Bangladesh\0" -"Barbados\0" -"Belarus\0" -"Belgium\0" -"Belize\0" -"Benin\0" -"Bermuda\0" -"Bhutan\0" -"Bolivia\0" -"BosniaAndHerzegowina\0" -"Botswana\0" -"BouvetIsland\0" -"Brazil\0" -"BritishIndianOceanTerritory\0" -"BruneiDarussalam\0" -"Bulgaria\0" -"BurkinaFaso\0" -"Burundi\0" -"Cambodia\0" -"Cameroon\0" -"Canada\0" -"CapeVerde\0" -"CaymanIslands\0" -"CentralAfricanRepublic\0" -"Chad\0" -"Chile\0" -"China\0" -"ChristmasIsland\0" -"CocosIslands\0" -"Colombia\0" -"Comoros\0" -"DetqmocraticRepublicOfCongo\0" -"PeoplesRepublicOfCongo\0" -"CookIslands\0" -"CostaRica\0" -"IvoryCoast\0" -"Croatia\0" -"Cuba\0" -"Cyprus\0" -"CzechRepublic\0" -"Denmark\0" -"Djibouti\0" -"Dominica\0" -"DominicanRepublic\0" -"EastTimor\0" -"Ecuador\0" -"Egypt\0" -"ElSalvador\0" -"EquatorialGuinea\0" -"Eritrea\0" -"Estonia\0" -"Ethiopia\0" -"FalklandIslands\0" -"FaroeIslands\0" -"Fiji\0" -"Finland\0" -"France\0" -"MetropolitanFrance\0" -"FrenchGuiana\0" -"FrenchPolynesia\0" -"FrenchSouthernTerritories\0" -"Gabon\0" -"Gambia\0" -"Georgia\0" -"Germany\0" -"Ghana\0" -"Gibraltar\0" -"Greece\0" -"Greenland\0" -"Grenada\0" -"Guadeloupe\0" -"Guam\0" -"Guatemala\0" -"Guinea\0" -"GuineaBissau\0" -"Guyana\0" -"Haiti\0" -"HeardAndMcDonaldIslands\0" -"Honduras\0" -"HongKong\0" -"Hungary\0" -"Iceland\0" -"India\0" -"Indonesia\0" -"Iran\0" -"Iraq\0" -"Ireland\0" -"Israel\0" -"Italy\0" -"Jamaica\0" -"Japan\0" -"Jordan\0" -"Kazakhstan\0" -"Kenya\0" -"Kiribati\0" -"DetqmocraticRepublicOfKorea\0" -"RepublicOfKorea\0" -"Kuwait\0" -"Kyrgyzstan\0" -"Lao\0" -"Latvia\0" -"Lebanon\0" -"Lesotho\0" -"Liberia\0" -"LibyanArabJamahiriya\0" -"Liechtenstein\0" -"Lithuania\0" -"Luxembourg\0" -"Macau\0" -"Macedonia\0" -"Madagascar\0" -"Malawi\0" -"Malaysia\0" -"Maldives\0" -"Mali\0" -"Malta\0" -"MarshallIslands\0" -"Martinique\0" -"Mauritania\0" -"Mauritius\0" -"Mayotte\0" -"Mexico\0" -"Micronesia\0" -"Moldova\0" -"Monaco\0" -"Mongolia\0" -"Montserrat\0" -"Morocco\0" -"Mozambique\0" -"Myanmar\0" -"Namibia\0" -"Nauru\0" -"Nepal\0" -"Netherlands\0" -"NetherlandsAntilles\0" -"NewCaledonia\0" -"NewZealand\0" -"Nicaragua\0" -"Niger\0" -"Nigeria\0" -"Niue\0" -"NorfolkIsland\0" -"NorthernMarianaIslands\0" -"Norway\0" -"Oman\0" -"Pakistan\0" -"Palau\0" -"PalestinianTerritory\0" -"Panama\0" -"PapuaNewGuinea\0" -"Paraguay\0" -"Peru\0" -"Philippines\0" -"Pitcairn\0" -"Poland\0" -"Portugal\0" -"PuertoRico\0" -"Qatar\0" -"Reunion\0" -"Romania\0" -"RussianFederation\0" -"Rwanda\0" -"SaintKittsAndNevis\0" -"StLucia\0" -"StVincentAndTheGrenadines\0" -"Samoa\0" -"SanMarino\0" -"SaoTomeAndPrincipe\0" -"SaudiArabia\0" -"Senegal\0" -"Seychelles\0" -"SierraLeone\0" -"Singapore\0" -"Slovakia\0" -"Slovenia\0" -"SolomonIslands\0" -"Somalia\0" -"SouthAfrica\0" -"SouthGeorgiaAndTheSouthSandwichIslands\0" -"Spain\0" -"SriLanka\0" -"StHelena\0" -"StPierreAndMiquelon\0" -"Sudan\0" -"Suriname\0" -"SvalbardAndJanMayenIslands\0" -"Swaziland\0" -"Sweden\0" -"Switzerland\0" -"SyrianArabRepublic\0" -"Taiwan\0" -"Tajikistan\0" -"Tanzania\0" -"Thailand\0" -"Togo\0" -"Tokelau\0" -"Tonga\0" -"TrinidadAndTobago\0" -"Tunisia\0" -"Turkey\0" -"Turkmenistan\0" -"TurksAndCaicosIslands\0" -"Tuvalu\0" -"Uganda\0" -"Ukraine\0" -"UnitedArabEmirates\0" -"UnitedKingdom\0" -"UnitedStates\0" -"UnitedStatesMinorOutlyingIslands\0" -"Uruguay\0" -"Uzbekistan\0" -"Vanuatu\0" -"VaticanCityState\0" -"Venezuela\0" -"VietNam\0" -"BritishVirginIslands\0" -"USVirginIslands\0" -"WallisAndFutunaIslands\0" -"WesternSahara\0" -"Yemen\0" -"Yugoslavia\0" -"Zambia\0" -"Zimbabwe\0"; - -static const uint country_name_index[] = { - 0,// AnyCountry - 8,// Afghanistan - 20,// Albania - 28,// Algeria - 36,// AmericanSamoa - 50,// Andorra - 58,// Angola - 65,// Anguilla - 74,// Antarctica - 85,// AntiguaAndBarbuda - 103,// Argentina - 113,// Armenia - 121,// Aruba - 127,// Australia - 137,// Austria - 145,// Azerbaijan - 156,// Bahamas - 164,// Bahrain - 172,// Bangladesh - 183,// Barbados - 192,// Belarus - 200,// Belgium - 208,// Belize - 215,// Benin - 221,// Bermuda - 229,// Bhutan - 236,// Bolivia - 244,// BosniaAndHerzegowina - 265,// Botswana - 274,// BouvetIsland - 287,// Brazil - 294,// BritishIndianOceanTerritory - 322,// BruneiDarussalam - 339,// Bulgaria - 348,// BurkinaFaso - 360,// Burundi - 368,// Cambodia - 377,// Cameroon - 386,// Canada - 393,// CapeVerde - 403,// CaymanIslands - 417,// CentralAfricanRepublic - 440,// Chad - 445,// Chile - 451,// China - 457,// ChristmasIsland - 473,// CocosIslands - 486,// Colombia - 495,// Comoros - 503,// DetqmocraticRepublicOfCongo - 529,// PeoplesRepublicOfCongo - 552,// CookIslands - 564,// CostaRica - 574,// IvoryCoast - 585,// Croatia - 593,// Cuba - 598,// Cyprus - 605,// CzechRepublic - 619,// Denmark - 627,// Djibouti - 636,// Dominica - 645,// DominicanRepublic - 663,// EastTimor - 673,// Ecuador - 681,// Egypt - 687,// ElSalvador - 698,// EquatorialGuinea - 715,// Eritrea - 723,// Estonia - 731,// Ethiopia - 740,// FalklandIslands - 756,// FaroeIslands - 769,// Fiji - 774,// Finland - 782,// France - 789,// MetropolitanFrance - 808,// FrenchGuiana - 821,// FrenchPolynesia - 837,// FrenchSouthernTerritories - 863,// Gabon - 869,// Gambia - 876,// Georgia - 884,// Germany - 892,// Ghana - 898,// Gibraltar - 908,// Greece - 915,// Greenland - 925,// Grenada - 933,// Guadeloupe - 944,// Guam - 949,// Guatemala - 959,// Guinea - 966,// GuineaBissau - 979,// Guyana - 986,// Haiti - 992,// HeardAndMcDonaldIslands - 1016,// Honduras - 1025,// HongKong - 1034,// Hungary - 1042,// Iceland - 1050,// India - 1056,// Indonesia - 1066,// Iran - 1071,// Iraq - 1076,// Ireland - 1084,// Israel - 1091,// Italy - 1097,// Jamaica - 1105,// Japan - 1111,// Jordan - 1118,// Kazakhstan - 1129,// Kenya - 1135,// Kiribati - 1144,// DetqmocraticRepublicOfKorea - 1170,// RepublicOfKorea - 1186,// Kuwait - 1193,// Kyrgyzstan - 1204,// Lao - 1208,// Latvia - 1215,// Lebanon - 1223,// Lesotho - 1231,// Liberia - 1239,// LibyanArabJamahiriya - 1260,// Liechtenstein - 1274,// Lithuania - 1284,// Luxembourg - 1295,// Macau - 1301,// Macedonia - 1311,// Madagascar - 1322,// Malawi - 1329,// Malaysia - 1338,// Maldives - 1347,// Mali - 1352,// Malta - 1358,// MarshallIslands - 1374,// Martinique - 1385,// Mauritania - 1396,// Mauritius - 1406,// Mayotte - 1414,// Mexico - 1421,// Micronesia - 1432,// Moldova - 1440,// Monaco - 1447,// Mongolia - 1456,// Montserrat - 1467,// Morocco - 1475,// Mozambique - 1486,// Myanmar - 1494,// Namibia - 1502,// Nauru - 1508,// Nepal - 1514,// Netherlands - 1526,// NetherlandsAntilles - 1546,// NewCaledonia - 1559,// NewZealand - 1570,// Nicaragua - 1580,// Niger - 1586,// Nigeria - 1594,// Niue - 1599,// NorfolkIsland - 1613,// NorthernMarianaIslands - 1636,// Norway - 1643,// Oman - 1648,// Pakistan - 1657,// Palau - 1663,// PalestinianTerritory - 1684,// Panama - 1691,// PapuaNewGuinea - 1706,// Paraguay - 1715,// Peru - 1720,// Philippines - 1732,// Pitcairn - 1741,// Poland - 1748,// Portugal - 1757,// PuertoRico - 1768,// Qatar - 1774,// Reunion - 1782,// Romania - 1790,// RussianFederation - 1808,// Rwanda - 1815,// SaintKittsAndNevis - 1834,// StLucia - 1842,// StVincentAndTheGrenadines - 1868,// Samoa - 1874,// SanMarino - 1884,// SaoTomeAndPrincipe - 1903,// SaudiArabia - 1915,// Senegal - 1923,// Seychelles - 1934,// SierraLeone - 1946,// Singapore - 1956,// Slovakia - 1965,// Slovenia - 1974,// SolomonIslands - 1989,// Somalia - 1997,// SouthAfrica - 2009,// SouthGeorgiaAndTheSouthSandwichIslands - 2048,// Spain - 2054,// SriLanka - 2063,// StHelena - 2072,// StPierreAndMiquelon - 2092,// Sudan - 2098,// Suriname - 2107,// SvalbardAndJanMayenIslands - 2134,// Swaziland - 2144,// Sweden - 2151,// Switzerland - 2163,// SyrianArabRepublic - 2182,// Taiwan - 2189,// Tajikistan - 2200,// Tanzania - 2209,// Thailand - 2218,// Togo - 2223,// Tokelau - 2231,// Tonga - 2237,// TrinidadAndTobago - 2255,// Tunisia - 2263,// Turkey - 2270,// Turkmenistan - 2283,// TurksAndCaicosIslands - 2305,// Tuvalu - 2312,// Uganda - 2319,// Ukraine - 2327,// UnitedArabEmirates - 2346,// UnitedKingdom - 2360,// UnitedStates - 2373,// UnitedStatesMinorOutlyingIslands - 2406,// Uruguay - 2414,// Uzbekistan - 2425,// Vanuatu - 2433,// VaticanCityState - 2450,// Venezuela - 2460,// VietNam - 2468,// BritishVirginIslands - 2489,// USVirginIslands - 2505,// WallisAndFutunaIslands - 2528,// WesternSahara - 2542,// Yemen - 2548,// Yugoslavia - 2559,// Zambia - 2566// Zimbabwe -}; - -static const char language_code_list[] = -" " // Unused -" " // C -"ab" // Abkhazian -"om" // Afan -"aa" // Afar -"af" // Afrikaans -"sq" // Albanian -"am" // Amharic -"ar" // Arabic -"hy" // Armenian -"as" // Assamese -"ay" // Aymara -"az" // Azerbaijani -"ba" // Bashkir -"eu" // Basque -"bn" // Bengali -"dz" // Bhutani -"bh" // Bihari -"bi" // Bislama -"br" // Breton -"bg" // Bulgarian -"my" // Burmese -"be" // Byelorussian -"km" // Cambodian -"ca" // Catalan -"zh" // Chinese -"co" // Corsican -"hr" // Croatian -"cs" // Czech -"da" // Danish -"nl" // Dutch -"en" // English -"eo" // Esperanto -"et" // Estonian -"fo" // Faroese -"fj" // Fiji -"fi" // Finnish -"fr" // French -"fy" // Frisian -"gd" // Gaelic -"gl" // Galician -"ka" // Georgian -"de" // German -"el" // Greek -"kl" // Greenlandic -"gn" // Guarani -"gu" // Gujarati -"ha" // Hausa -"he" // Hebrew -"hi" // Hindi -"hu" // Hungarian -"is" // Icelandic -"id" // Indonesian -"ia" // Interlingua -"ie" // Interlingue -"iu" // Inuktitut -"ik" // Inupiak -"ga" // Irish -"it" // Italian -"ja" // Japanese -"jv" // Javanese -"kn" // Kannada -"ks" // Kashmiri -"kk" // Kazakh -"rw" // Kinyarwanda -"ky" // Kirghiz -"ko" // Korean -"ku" // Kurdish -"rn" // Kurundi -"lo" // Laothian -"la" // Latin -"lv" // Latvian -"ln" // Lingala -"lt" // Lithuanian -"mk" // Macedonian -"mg" // Malagasy -"ms" // Malay -"ml" // Malayalam -"mt" // Maltese -"mi" // Maori -"mr" // Marathi -"mo" // Moldavian -"mn" // Mongolian -"na" // Nauru -"ne" // Nepali -"no" // Norwegian -"oc" // Occitan -"or" // Oriya -"ps" // Pashto -"fa" // Persian -"pl" // Polish -"pt" // Portuguese -"pa" // Punjabi -"qu" // Quechua -"rm" // RhaetoRomance -"ro" // Romanian -"ru" // Russian -"sm" // Samoan -"sg" // Sangho -"sa" // Sanskrit -"sr" // Serbian -"sh" // SerboCroatian -"st" // Sesotho -"tn" // Setswana -"sn" // Shona -"sd" // Sindhi -"si" // Singhalese -"ss" // Siswati -"sk" // Slovak -"sl" // Slovenian -"so" // Somali -"es" // Spanish -"su" // Sundanese -"sw" // Swahili -"sv" // Swedish -"tl" // Tagalog -"tg" // Tajik -"ta" // Tamil -"tt" // Tatar -"te" // Telugu -"th" // Thai -"bo" // Tibetan -"ti" // Tigrinya -"to" // Tonga -"ts" // Tsonga -"tr" // Turkish -"tk" // Turkmen -"tw" // Twi -"ug" // Uigur -"uk" // Ukrainian -"ur" // Urdu -"uz" // Uzbek -"vi" // Vietnamese -"vo" // Volapuk -"cy" // Welsh -"wo" // Wolof -"xh" // Xhosa -"yi" // Yiddish -"yo" // Yoruba -"za" // Zhuang -"zu" // Zulu -; - -static const char country_code_list[] = -" " // AnyLanguage -"AF" // Afghanistan -"AL" // Albania -"DZ" // Algeria -"AS" // AmericanSamoa -"AD" // Andorra -"AO" // Angola -"AI" // Anguilla -"AQ" // Antarctica -"AG" // AntiguaAndBarbuda -"AR" // Argentina -"AM" // Armenia -"AW" // Aruba -"AU" // Australia -"AT" // Austria -"AZ" // Azerbaijan -"BS" // Bahamas -"BH" // Bahrain -"BD" // Bangladesh -"BB" // Barbados -"BY" // Belarus -"BE" // Belgium -"BZ" // Belize -"BJ" // Benin -"BM" // Bermuda -"BT" // Bhutan -"BO" // Bolivia -"BA" // BosniaAndHerzegowina -"BW" // Botswana -"BV" // BouvetIsland -"BR" // Brazil -"IO" // BritishIndianOceanTerritory -"BN" // BruneiDarussalam -"BG" // Bulgaria -"BF" // BurkinaFaso -"BI" // Burundi -"KH" // Cambodia -"CM" // Cameroon -"CA" // Canada -"CV" // CapeVerde -"KY" // CaymanIslands -"CF" // CentralAfricanRepublic -"TD" // Chad -"CL" // Chile -"CN" // China -"CX" // ChristmasIsland -"CC" // CocosIslands -"CO" // Colombia -"KM" // Comoros -"CD" // DetqmocraticRepublicOfCongo -"CG" // PeoplesRepublicOfCongo -"CK" // CookIslands -"CR" // CostaRica -"CI" // IvoryCoast -"HR" // Croatia -"CU" // Cuba -"CY" // Cyprus -"CZ" // CzechRepublic -"DK" // Denmark -"DJ" // Djibouti -"DM" // Dominica -"DO" // DominicanRepublic -"TL" // EastTimor -"EC" // Ecuador -"EG" // Egypt -"SV" // ElSalvador -"GQ" // EquatorialGuinea -"ER" // Eritrea -"EE" // Estonia -"ET" // Ethiopia -"FK" // FalklandIslands -"FO" // FaroeIslands -"FJ" // Fiji -"FI" // Finland -"FR" // France -"FX" // MetropolitanFrance -"GF" // FrenchGuiana -"PF" // FrenchPolynesia -"TF" // FrenchSouthernTerritories -"GA" // Gabon -"GM" // Gambia -"GE" // Georgia -"DE" // Germany -"GH" // Ghana -"GI" // Gibraltar -"GR" // Greece -"GL" // Greenland -"GD" // Grenada -"GP" // Guadeloupe -"GU" // Guam -"GT" // Guatemala -"GN" // Guinea -"GW" // GuineaBissau -"GY" // Guyana -"HT" // Haiti -"HM" // HeardAndMcDonaldIslands -"HN" // Honduras -"HK" // HongKong -"HU" // Hungary -"IS" // Iceland -"IN" // India -"ID" // Indonesia -"IR" // Iran -"IQ" // Iraq -"IE" // Ireland -"IL" // Israel -"IT" // Italy -"JM" // Jamaica -"JP" // Japan -"JO" // Jordan -"KZ" // Kazakhstan -"KE" // Kenya -"KI" // Kiribati -"KP" // DetqmocraticRepublicOfKorea -"KR" // RepublicOfKorea -"KW" // Kuwait -"KG" // Kyrgyzstan -"LA" // Lao -"LV" // Latvia -"LB" // Lebanon -"LS" // Lesotho -"LR" // Liberia -"LY" // LibyanArabJamahiriya -"LI" // Liechtenstein -"LT" // Lithuania -"LU" // Luxembourg -"MO" // Macau -"MK" // Macedonia -"MG" // Madagascar -"MW" // Malawi -"MY" // Malaysia -"MV" // Maldives -"ML" // Mali -"MT" // Malta -"MH" // MarshallIslands -"MQ" // Martinique -"MR" // Mauritania -"MU" // Mauritius -"YT" // Mayotte -"MX" // Mexico -"FM" // Micronesia -"MD" // Moldova -"MC" // Monaco -"MN" // Mongolia -"MS" // Montserrat -"MA" // Morocco -"MZ" // Mozambique -"MM" // Myanmar -"NA" // Namibia -"NR" // Nauru -"NP" // Nepal -"NL" // Netherlands -"AN" // NetherlandsAntilles -"NC" // NewCaledonia -"NZ" // NewZealand -"NI" // Nicaragua -"NE" // Niger -"NG" // Nigeria -"NU" // Niue -"NF" // NorfolkIsland -"MP" // NorthernMarianaIslands -"NO" // Norway -"OM" // Oman -"PK" // Pakistan -"PW" // Palau -"PS" // PalestinianTerritory -"PA" // Panama -"PG" // PapuaNewGuinea -"PY" // Paraguay -"PE" // Peru -"PH" // Philippines -"PN" // Pitcairn -"PL" // Poland -"PT" // Portugal -"PR" // PuertoRico -"QA" // Qatar -"RE" // Reunion -"RO" // Romania -"RU" // RussianFederation -"RW" // Rwanda -"KN" // SaintKittsAndNevis -"LC" // StLucia -"VC" // StVincentAndTheGrenadines -"WS" // Samoa -"SM" // SanMarino -"ST" // SaoTomeAndPrincipe -"SA" // SaudiArabia -"SN" // Senegal -"SC" // Seychelles -"SL" // SierraLeone -"SG" // Singapore -"SK" // Slovakia -"SI" // Slovenia -"SB" // SolomonIslands -"SO" // Somalia -"ZA" // SouthAfrica -"GS" // SouthGeorgiaAndTheSouthSandwichIslands -"ES" // Spain -"LK" // SriLanka -"SH" // StHelena -"PM" // StPierreAndMiquelon -"SD" // Sudan -"SR" // Suriname -"SJ" // SvalbardAndJanMayenIslands -"SZ" // Swaziland -"SE" // Sweden -"CH" // Switzerland -"SY" // SyrianArabRepublic -"TW" // Taiwan -"TJ" // Tajikistan -"TZ" // Tanzania -"TH" // Thailand -"TG" // Togo -"TK" // Tokelau -"TO" // Tonga -"TT" // TrinidadAndTobago -"TN" // Tunisia -"TR" // Turkey -"TM" // Turkmenistan -"TC" // TurksAndCaicosIslands -"TV" // Tuvalu -"UG" // Uganda -"UA" // Ukraine -"AE" // UnitedArabEmirates -"GB" // UnitedKingdom -"US" // UnitedStates -"UM" // UnitedStatesMinorOutlyingIslands -"UY" // Uruguay -"UZ" // Uzbekistan -"VU" // Vanuatu -"VA" // VaticanCityState -"VE" // Venezuela -"VN" // VietNam -"VG" // BritishVirginIslands -"VI" // USVirginIslands -"WF" // WallisAndFutunaIslands -"EH" // WesternSahara -"YE" // Yemen -"YU" // Yugoslavia -"ZM" // Zambia -"ZW" // Zimbabwe -; - -static TQLocale::Language codeToLanguage(const TQString &code) -{ - if (code.length() != 2) - return TQLocale::C; - - ushort uc1 = code.tqunicode()[0].tqunicode(); - ushort uc2 = code.tqunicode()[1].tqunicode(); - - const char *c = language_code_list; - for (; *c != 0; c += 2) { - if (uc1 == (unsigned char)c[0] && uc2 == (unsigned char)c[1]) - return (TQLocale::Language) ((c - language_code_list)/2); - } - - return TQLocale::C; -} - -static TQLocale::Country codeToCountry(const TQString &code) -{ - if (code.length() != 2) - return TQLocale::AnyCountry; - - ushort uc1 = code.tqunicode()[0].tqunicode(); - ushort uc2 = code.tqunicode()[1].tqunicode(); - - const char *c = country_code_list; - for (; *c != 0; c += 2) { - if (uc1 == (unsigned char)c[0] && uc2 == (unsigned char)c[1]) - return (TQLocale::Country) ((c - country_code_list)/2); - } - - return TQLocale::AnyCountry; -} - -static TQString languageToCode(TQLocale::Language language) -{ - if (language == TQLocale::C) - return "C"; - - TQString code; - code.setLength(2); - const char *c = language_code_list + 2*(uint)language; - code[0] = c[0]; - code[1] = c[1]; - return code; -} - -static TQString countryToCode(TQLocale::Country country) -{ - if (country == TQLocale::AnyCountry) - return TQString::null; - - TQString code; - code.setLength(2); - const char *c = country_code_list + 2*(uint)country; - code[0] = c[0]; - code[1] = c[1]; - return code; -} - -const TQLocalePrivate *TQLocale::default_d = 0; - -TQString TQLocalePrivate::infinity() const -{ - return TQString::tqfromLatin1("inf"); -} - -TQString TQLocalePrivate::nan() const -{ - return TQString::tqfromLatin1("nan"); -} - -#if defined(TQ_OS_WIN) -/* Win95 doesn't have a function to return the ISO lang/country name of the user's locale. - Instead it can return a "Windows code". This maps windows codes to ISO country names. */ - -struct WindowsToISOListElt { - int windows_code; - char iso_name[6]; -}; - -static const WindowsToISOListElt windows_to_iso_list[] = { - { 0x0401, "ar_SA" }, - { 0x0402, "bg\0 " }, - { 0x0403, "ca\0 " }, - { 0x0404, "zh_TW" }, - { 0x0405, "cs\0 " }, - { 0x0406, "da\0 " }, - { 0x0407, "de\0 " }, - { 0x0408, "el\0 " }, - { 0x0409, "en_US" }, - { 0x040a, "es\0 " }, - { 0x040b, "fi\0 " }, - { 0x040c, "fr\0 " }, - { 0x040d, "he\0 " }, - { 0x040e, "hu\0 " }, - { 0x040f, "is\0 " }, - { 0x0410, "it\0 " }, - { 0x0411, "ja\0 " }, - { 0x0412, "ko\0 " }, - { 0x0413, "nl\0 " }, - { 0x0414, "no\0 " }, - { 0x0415, "pl\0 " }, - { 0x0416, "pt_BR" }, - { 0x0418, "ro\0 " }, - { 0x0419, "ru\0 " }, - { 0x041a, "hr\0 " }, - { 0x041c, "sq\0 " }, - { 0x041d, "sv\0 " }, - { 0x041e, "th\0 " }, - { 0x041f, "tr\0 " }, - { 0x0420, "ur\0 " }, - { 0x0421, "in\0 " }, - { 0x0422, "uk\0 " }, - { 0x0423, "be\0 " }, - { 0x0425, "et\0 " }, - { 0x0426, "lv\0 " }, - { 0x0427, "lt\0 " }, - { 0x0429, "fa\0 " }, - { 0x042a, "vi\0 " }, - { 0x042d, "eu\0 " }, - { 0x042f, "mk\0 " }, - { 0x0436, "af\0 " }, - { 0x0438, "fo\0 " }, - { 0x0439, "hi\0 " }, - { 0x043e, "ms\0 " }, - { 0x0458, "mt\0 " }, - { 0x0801, "ar_IQ" }, - { 0x0804, "zh_CN" }, - { 0x0807, "de_CH" }, - { 0x0809, "en_GB" }, - { 0x080a, "es_MX" }, - { 0x080c, "fr_BE" }, - { 0x0810, "it_CH" }, - { 0x0812, "ko\0 " }, - { 0x0813, "nl_BE" }, - { 0x0814, "no\0 " }, - { 0x0816, "pt\0 " }, - { 0x081a, "sr\0 " }, - { 0x081d, "sv_FI" }, - { 0x0c01, "ar_EG" }, - { 0x0c04, "zh_HK" }, - { 0x0c07, "de_AT" }, - { 0x0c09, "en_AU" }, - { 0x0c0a, "es\0 " }, - { 0x0c0c, "fr_CA" }, - { 0x0c1a, "sr\0 " }, - { 0x1001, "ar_LY" }, - { 0x1004, "zh_SG" }, - { 0x1007, "de_LU" }, - { 0x1009, "en_CA" }, - { 0x100a, "es_GT" }, - { 0x100c, "fr_CH" }, - { 0x1401, "ar_DZ" }, - { 0x1407, "de_LI" }, - { 0x1409, "en_NZ" }, - { 0x140a, "es_CR" }, - { 0x140c, "fr_LU" }, - { 0x1801, "ar_MA" }, - { 0x1809, "en_IE" }, - { 0x180a, "es_PA" }, - { 0x1c01, "ar_TN" }, - { 0x1c09, "en_ZA" }, - { 0x1c0a, "es_DO" }, - { 0x2001, "ar_OM" }, - { 0x2009, "en_JM" }, - { 0x200a, "es_VE" }, - { 0x2401, "ar_YE" }, - { 0x2409, "en\0 " }, - { 0x240a, "es_CO" }, - { 0x2801, "ar_SY" }, - { 0x2809, "en_BZ" }, - { 0x280a, "es_PE" }, - { 0x2c01, "ar_JO" }, - { 0x2c09, "en_TT" }, - { 0x2c0a, "es_AR" }, - { 0x3001, "ar_LB" }, - { 0x300a, "es_EC" }, - { 0x3401, "ar_KW" }, - { 0x340a, "es_CL" }, - { 0x3801, "ar_AE" }, - { 0x380a, "es_UY" }, - { 0x3c01, "ar_BH" }, - { 0x3c0a, "es_PY" }, - { 0x4001, "ar_QA" }, - { 0x400a, "es_BO" }, - { 0x440a, "es_SV" }, - { 0x480a, "es_HN" }, - { 0x4c0a, "es_NI" }, - { 0x500a, "es_PR" } -}; - -static const int windows_to_iso_count - = sizeof(windows_to_iso_list)/sizeof(WindowsToISOListElt); - -static const char *winLangCodeToIsoName(int code) -{ - int cmp = code - windows_to_iso_list[0].windows_code; - if (cmp < 0) - return 0; - - if (cmp == 0) - return windows_to_iso_list[0].iso_name; - - int begin = 0; - int end = windows_to_iso_count; - - while (end - begin > 1) { - uint mid = (begin + end)/2; - - const WindowsToISOListElt *elt = windows_to_iso_list + mid; - int cmp = code - elt->windows_code; - if (cmp < 0) - end = mid; - else if (cmp > 0) - begin = mid; - else - return elt->iso_name; - } - - return 0; - -} -#endif // TQ_OS_WIN - -const char* TQLocalePrivate::systemLocaleName() -{ - static TQCString lang; - lang = getenv( "LANG" ); - -#if !defined( TQWS ) && defined( TQ_OS_MAC ) - if ( !lang.isEmpty() ) - return lang; - - char mac_ret[255]; - if(!LocaleRefGetPartString(NULL, kLocaleLanguageMask | kLocaleRegionMask, 255, mac_ret)) - lang = mac_ret; -#endif - -#if defined(TQ_WS_WIN) - if ( !lang.isEmpty() ) { - long id = 0; - bool ok = false; - id = qstrtoll(lang.data(), 0, 0, &ok); - if ( !ok || id == 0 || id < INT_MIN || id > INT_MAX ) - return lang; - else - return winLangCodeToIsoName( (int)id ); - } - - if (qWinVersion() == TQt::WV_95) { - lang = winLangCodeToIsoName(GetUserDefaultLangID()); - } else { - TQT_WA( { - wchar_t out[256]; - TQString language; - TQString sublanguage; - if ( GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME , out, 255 ) ) - language = TQString::fromUcs2( (ushort*)out ); - if ( GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, out, 255 ) ) - sublanguage = TQString::fromUcs2( (ushort*)out ).lower(); - lang = language; - if ( sublanguage != language && !sublanguage.isEmpty() ) - lang += "_" + sublanguage.upper(); - } , { - char out[256]; - TQString language; - TQString sublanguage; - if ( GetLocaleInfoA( LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, out, 255 ) ) - language = TQString::fromLocal8Bit( out ); - if ( GetLocaleInfoA( LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, out, 255 ) ) - sublanguage = TQString::fromLocal8Bit( out ).lower(); - lang = language; - if ( sublanguage != language && !sublanguage.isEmpty() ) - lang += "_" + sublanguage.upper(); - } ); - } -#endif - if ( lang.isEmpty() ) - lang = "C"; - - return lang; -} - -static const TQLocalePrivate *findLocale(TQLocale::Language language, - TQLocale::Country country) -{ - unsigned language_id = (unsigned)language; - unsigned country_id = (unsigned)country; - - uint idx = locale_index[language_id]; - - const TQLocalePrivate *d = locale_data + idx; - - if (idx == 0) // default language has no associated country - return d; - - if (country == TQLocale::AnyCountry) - return d; - - TQ_ASSERT(d->languageId() == language_id); - - while (d->languageId() == language_id - && d->countryId() != country_id) - ++d; - - if (d->countryId() == country_id - && d->languageId() == language_id) - return d; - - return locale_data + idx; -} - -/*! - \class TQLocale - \brief The TQLocale class converts between numbers and their - string representations in various languages. - - \reentrant - \ingroup text - - It is initialized with a country/language pair in its constructor - and offers number-to-string and string-to-number conversion - functions simmilar to those in TQString. - - \code - TQLocale egyptian(TQLocale::Arabic, TQLocale::Egypt); - TQString s1 = egyptian.toString(1.571429E+07, 'e'); - TQString s2 = egyptian.toString(10); - - double d = egyptian.toDouble(s1); - int s2 = egyptian.toInt(s2); - \endcode - - TQLocale supports the concept of a default locale, which is - determined from the system's locale settings at application - startup. The default locale can be changed by calling the - static member setDefault(). The default locale has the - following effects: - - \list - \i If a TQLocale object is constructed with the default constructor, - it will use the default locale's settings. - \i TQString::toDouble() interprets the string according to the default - locale. If this fails, it falls back on the "C" locale. - \i TQString::arg() uses the default locale to format a number when - its position specifier in the format string contains an 'L', - e.g. "%L1". - \endlist - - \code - TQLocale::setDefault(TQLocale(TQLocale::Hebrew, TQLocale::Israel)); - TQLocale hebrew; // Constructs a default TQLocale - TQString s1 = hebrew.toString(15714.3, 'e'); - - bool ok; - double d; - - TQLocale::setDefault(TQLocale::C); - d = TQString( "1234,56" ).toDouble(&ok); // ok == false - d = TQString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56 - - TQLocale::setDefault(TQLocale::German); - d = TQString( "1234,56" ).toDouble(&ok); // ok == true, d == 1234.56 - d = TQString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56 - - TQLocale::setDefault(TQLocale(TQLocale::English, TQLocale::UnitedStates)); - str = TQString( "%1 %L2 %L3" ) - .arg( 12345 ) - .arg( 12345 ) - .arg( 12345, 0, 16 ); - // str == "12345 12,345 3039" - \endcode - - When a language/country pair is specified in the constructor, one - of three things can happen: - - \list - \i If the language/country pair is found in the database, it is used. - \i If the language is found but the country is not, or if the country - is \c AnyCountry, the language is used with the most - appropriate available country (for example, Germany for German), - \i If neither the language nor the country are found, TQLocale - defaults to the default locale (see setDefault()). - \endlist - - The "C" locale is identical to English/UnitedStates. - - Use language() and country() to determine the actual language and - country values used. - - An alternative method for constructing a TQLocale object is by - specifying the locale name. - - \code - TQLocale korean("ko"); - TQLocale swiss("de_CH"); - \endcode - - This constructor converts the locale name to a language/country - pair; it does not use the system locale database. - - All the methods in TQLocale, with the exception of setDefault(), - are reentrant. - - \sa TQString::toDouble() TQString::arg() - - The double-to-string and string-to-double conversion functions are - covered by the following licenses: - - \legalese - - Copyright (c) 1991 by AT&T. - - Permission to use, copy, modify, and distribute this software for any - purpose without fee is hereby granted, provided that this entire notice - is included in all copies of any software which is or includes a copy - or modification of this software and in all copies of the supporting - documentation for such software. - - THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED - WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY - REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY - OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. - - This product includes software developed by the University of - California, Berkeley and its contributors. -*/ - -/*! - \enum TQLocale::Language - - This enumerated type is used to specify a language. - - \value C Identical to English/UnitedStates - \value Abkhazian - \value Afan - \value Afar - \value Afrikaans - \value Albanian - \value Amharic - \value Arabic - \value Armenian - \value Assamese - \value Aymara - \value Azerbaijani - \value Bashkir - \value Basque - \value Bengali - \value Bhutani - \value Bihari - \value Bislama - \value Breton - \value Bulgarian - \value Burmese - \value Byelorussian - \value Cambodian - \value Catalan - \value Chinese - \value Corsican - \value Croatian - \value Czech - \value Danish - \value Dutch - \value English - \value Esperanto - \value Estonian - \value Faroese - \value FijiLanguage - \value Finnish - \value French - \value Frisian - \value Gaelic - \value Galician - \value Georgian - \value German - \value Greek - \value Greenlandic - \value Guarani - \value Gujarati - \value Hausa - \value Hebrew - \value Hindi - \value Hungarian - \value Icelandic - \value Indonesian - \value Interlingua - \value Interlingue - \value Inuktitut - \value Inupiak - \value Irish - \value Italian - \value Japanese - \value Javanese - \value Kannada - \value Kashmiri - \value Kazakh - \value Kinyarwanda - \value Kirghiz - \value Korean - \value Kurdish - \value Kurundi - \value Laothian - \value Latin - \value Latvian - \value Lingala - \value Lithuanian - \value Macedonian - \value Malagasy - \value Malay - \value Malayalam - \value Maltese - \value Maori - \value Marathi - \value Moldavian - \value Mongolian - \value NauruLanguage - \value Nepali - \value Norwegian - \value Occitan - \value Oriya - \value Pashto - \value Persian - \value Polish - \value Portuguese - \value Punjabi - \value Quechua - \value RhaetoRomance - \value Romanian - \value Russian - \value Samoan - \value Sangho - \value Sanskrit - \value Serbian - \value SerboCroatian - \value Sesotho - \value Setswana - \value Shona - \value Sindhi - \value Singhalese - \value Siswati - \value Slovak - \value Slovenian - \value Somali - \value Spanish - \value Sundanese - \value Swahili - \value Swedish - \value Tagalog - \value Tajik - \value Tamil - \value Tatar - \value Telugu - \value Thai - \value Tibetan - \value Tigrinya - \value TongaLanguage - \value Tsonga - \value Turkish - \value Turkmen - \value Twi - \value Uigur - \value Ukrainian - \value Urdu - \value Uzbek - \value Vietnamese - \value Volapuk - \value Welsh - \value Wolof - \value Xhosa - \value Yiddish - \value Yoruba - \value Zhuang - \value Zulu -*/ - -/*! - \enum TQLocale::Country - - This enumerated type is used to specify a country. - - \value AnyCountry - \value Afghanistan - \value Albania - \value Algeria - \value AmericanSamoa - \value Andorra - \value Angola - \value Anguilla - \value Antarctica - \value AntiguaAndBarbuda - \value Argentina - \value Armenia - \value Aruba - \value Australia - \value Austria - \value Azerbaijan - \value Bahamas - \value Bahrain - \value Bangladesh - \value Barbados - \value Belarus - \value Belgium - \value Belize - \value Benin - \value Bermuda - \value Bhutan - \value Bolivia - \value BosniaAndHerzegowina - \value Botswana - \value BouvetIsland - \value Brazil - \value BritishIndianOceanTerritory - \value BruneiDarussalam - \value Bulgaria - \value BurkinaFaso - \value Burundi - \value Cambodia - \value Cameroon - \value Canada - \value CapeVerde - \value CaymanIslands - \value CentralAfricanRepublic - \value Chad - \value Chile - \value China - \value ChristmasIsland - \value CocosIslands - \value Colombia - \value Comoros - \value DetqmocraticRepublicOfCongo - \value PeoplesRepublicOfCongo - \value CookIslands - \value CostaRica - \value IvoryCoast - \value Croatia - \value Cuba - \value Cyprus - \value CzechRepublic - \value Denmark - \value Djibouti - \value Dominica - \value DominicanRepublic - \value EastTimor - \value Ecuador - \value Egypt - \value ElSalvador - \value EquatorialGuinea - \value Eritrea - \value Estonia - \value Ethiopia - \value FalklandIslands - \value FaroeIslands - \value FijiCountry - \value Finland - \value France - \value MetropolitanFrance - \value FrenchGuiana - \value FrenchPolynesia - \value FrenchSouthernTerritories - \value Gabon - \value Gambia - \value Georgia - \value Germany - \value Ghana - \value Gibraltar - \value Greece - \value Greenland - \value Grenada - \value Guadeloupe - \value Guam - \value Guatemala - \value Guinea - \value GuineaBissau - \value Guyana - \value Haiti - \value HeardAndMcDonaldIslands - \value Honduras - \value HongKong - \value Hungary - \value Iceland - \value India - \value Indonesia - \value Iran - \value Iraq - \value Ireland - \value Israel - \value Italy - \value Jamaica - \value Japan - \value Jordan - \value Kazakhstan - \value Kenya - \value Kiribati - \value DetqmocraticRepublicOfKorea - \value RepublicOfKorea - \value Kuwait - \value Kyrgyzstan - \value Lao - \value Latvia - \value Lebanon - \value Lesotho - \value Liberia - \value LibyanArabJamahiriya - \value Liechtenstein - \value Lithuania - \value Luxembourg - \value Macau - \value Macedonia - \value Madagascar - \value Malawi - \value Malaysia - \value Maldives - \value Mali - \value Malta - \value MarshallIslands - \value Martinique - \value Mauritania - \value Mauritius - \value Mayotte - \value Mexico - \value Micronesia - \value Moldova - \value Monaco - \value Mongolia - \value Montserrat - \value Morocco - \value Mozambique - \value Myanmar - \value Namibia - \value NauruCountry - \value Nepal - \value Netherlands - \value NetherlandsAntilles - \value NewCaledonia - \value NewZealand - \value Nicaragua - \value Niger - \value Nigeria - \value Niue - \value NorfolkIsland - \value NorthernMarianaIslands - \value Norway - \value Oman - \value Pakistan - \value Palau - \value PalestinianTerritory - \value Panama - \value PapuaNewGuinea - \value Paraguay - \value Peru - \value Philippines - \value Pitcairn - \value Poland - \value Portugal - \value PuertoRico - \value Qatar - \value Reunion - \value Romania - \value RussianFederation - \value Rwanda - \value SaintKittsAndNevis - \value StLucia - \value StVincentAndTheGrenadines - \value Samoa - \value SanMarino - \value SaoTomeAndPrincipe - \value SaudiArabia - \value Senegal - \value Seychelles - \value SierraLeone - \value Singapore - \value Slovakia - \value Slovenia - \value SolomonIslands - \value Somalia - \value SouthAfrica - \value SouthGeorgiaAndTheSouthSandwichIslands - \value Spain - \value SriLanka - \value StHelena - \value StPierreAndMiquelon - \value Sudan - \value Suriname - \value SvalbardAndJanMayenIslands - \value Swaziland - \value Sweden - \value Switzerland - \value SyrianArabRepublic - \value Taiwan - \value Tajikistan - \value Tanzania - \value Thailand - \value Togo - \value Tokelau - \value TongaCountry - \value TrinidadAndTobago - \value Tunisia - \value Turkey - \value Turkmenistan - \value TurksAndCaicosIslands - \value Tuvalu - \value Uganda - \value Ukraine - \value UnitedArabEmirates - \value UnitedKingdom - \value UnitedStates - \value UnitedStatesMinorOutlyingIslands - \value Uruguay - \value Uzbekistan - \value Vanuatu - \value VaticanCityState - \value Venezuela - \value VietNam - \value BritishVirginIslands - \value USVirginIslands - \value WallisAndFutunaIslands - \value WesternSahara - \value Yemen - \value Yugoslavia - \value Zambia - \value Zimbabwe -*/ - -/*! - Constructs a TQLocale object with the specified \a name, - which has the format - "language[_country][.codeset][@modifier]" or "C", where: - - \list - \i language is a lowercase, two-letter, ISO 639 language code, - \i territory is an uppercase, two-letter, ISO 3166 country code, - \i and codeset and modifier are ignored. - \endlist - - If the string violates the locale format, or language is not - a valid ISO 369 code, the "C" locale is used instead. If country - is not present, or is not a valid ISO 3166 code, the most - appropriate country is chosen for the specified language. - - The language and country codes are converted to their respective - \c Language and \c Country enums. After this conversion is - performed the constructor behaves exactly like TQLocale(Country, - Language). - - This constructor is much slower than TQLocale(Country, Language). - - \sa name() -*/ - -TQLocale::TQLocale(const TQString &name) -{ - Language lang = C; - Country cntry = AnyCountry; - - uint l = name.length(); - - do { - if (l < 2) - break; - - const TQChar *uc = name.tqunicode(); - if (l > 2 - && uc[2] != '_' - && uc[2] != '.' - && uc[2] != '@') - break; - - lang = codeToLanguage(name.mid(0, 2)); - if (lang == C) - break; - - if (l == 2 || uc[2] == '.' || uc[2] == '@') - break; - - // we have uc[2] == '_' - if (l < 5) - break; - - if (l > 5 && uc[5] != '.' && uc[5] != '@') - break; - - cntry = codeToCountry(name.mid(3, 2)); - } while (FALSE); - - d = findLocale(lang, cntry); -} - -/*! - Constructs a TQLocale object initialized with the default locale. - - \sa setDefault() -*/ - -TQLocale::TQLocale() -{ - if (default_d == 0) - default_d = system().d; - - d = default_d; -} - -/*! - Constructs a TQLocale object with the specified \a language and \a - country. - - \list - \i If the language/country pair is found in the database, it is used. - \i If the language is found but the country is not, or if the country - is \c AnyCountry, the language is used with the most - appropriate available country (for example, Germany for German), - \i If neither the language nor the country are found, TQLocale - defaults to the default locale (see setDefault()). - \endlist - - The language and country that are actually used can be queried - using language() and country(). - - \sa setDefault() language() country() -*/ - -TQLocale::TQLocale(Language language, Country country) -{ - d = findLocale(language, country); - - // If not found, should default to system - if (d->languageId() == TQLocale::C && language != TQLocale::C) { - if (default_d == 0) - default_d = system().d; - - d = default_d; - } -} - -/*! - Constructs a TQLocale object as a copy of \a other. -*/ - -TQLocale::TQLocale(const TQLocale &other) -{ - d = other.d; -} - -/*! - Assigns \a other to this TQLocale object and returns a reference - to this TQLocale object. -*/ - -TQLocale &TQLocale::operator=(const TQLocale &other) -{ - d = other.d; - return *this; -} - -/*! - \nonreentrant - - Sets the global default locale to \a locale. These - values are used when a TQLocale object is constructed with - no arguments. If this function is not called, the system's - locale is used. - - \warning In a multithreaded application, the default locale - should be set at application startup, before any non-GUI threads - are created. - - \sa system() c() -*/ - -void TQLocale::setDefault(const TQLocale &locale) -{ - default_d = locale.d; -} - -/*! - Returns the language of this locale. - - \sa TQLocale() -*/ -TQLocale::Language TQLocale::language() const -{ - return (Language)d->languageId(); -} - -/*! - Returns the country of this locale. - - \sa TQLocale() -*/ -TQLocale::Country TQLocale::country() const -{ - return (Country)d->countryId(); -} - -/*! - Returns the language and country of this locale as a - string of the form "language_country", where - language is a lowercase, two-letter ISO 639 language code, - and country is an uppercase, two-letter ISO 3166 country code. - - \sa TQLocale() -*/ - -TQString TQLocale::name() const -{ - Language l = language(); - - TQString result = languageToCode(l); - - if (l == C) - return result; - - Country c = country(); - if (c == AnyCountry) - return result; - - result.append('_'); - result.append(countryToCode(c)); - - return result; -} - -/*! - Returns a TQString containing the name of \a language. -*/ - -TQString TQLocale::languageToString(Language language) -{ - if ((uint)language > (uint)TQLocale::LastLanguage) - return "Unknown"; - return language_name_list + language_name_index[(uint)language]; -} - -/*! - Returns a TQString containing the name of \a country. -*/ - -TQString TQLocale::countryToString(Country country) -{ - if ((uint)country > (uint)TQLocale::LastCountry) - return "Unknown"; - return country_name_list + country_name_index[(uint)country]; -} - -/*! - Returns the short int represented by the localized string \a s, or - 0 if the conversion failed. - - If \a ok is not 0, reports failure by setting - *ok to false and success by setting *ok to true. - - This function ignores leading and trailing whitespace. - - \sa toString() -*/ - -short TQLocale::toShort(const TQString &s, bool *ok) const -{ - TQ_LLONG i = toLongLong(s, ok); - if (i < SHRT_MIN || i > SHRT_MAX) { - if (ok != 0) - *ok = FALSE; - return 0; - } - return (short) i; -} - -/*! - Returns the unsigned short int represented by the localized string - \a s, or 0 if the conversion failed. - - If \a ok is not 0, reports failure by setting - *ok to false and success by setting *ok to true. - - This function ignores leading and trailing whitespace. - - \sa toString() -*/ - -ushort TQLocale::toUShort(const TQString &s, bool *ok) const -{ - TQ_ULLONG i = toULongLong(s, ok); - if (i > USHRT_MAX) { - if (ok != 0) - *ok = FALSE; - return 0; - } - return (ushort) i; -} - -/*! - Returns the int represented by the localized string \a s, or 0 if - the conversion failed. - - If \a ok is not 0, reports failure by setting *ok to false and - success by setting *ok to true. - - This function ignores leading and trailing whitespace. - - \sa toString() -*/ - -int TQLocale::toInt(const TQString &s, bool *ok) const -{ - TQ_LLONG i = toLongLong(s, ok); - if (i < INT_MIN || i > INT_MAX) { - if (ok != 0) - *ok = FALSE; - return 0; - } - return (int) i; -} - -/*! - Returns the unsigned int represented by the localized string \a s, - or 0 if the conversion failed. - - If \a ok is not 0, reports failure by setting - *ok to false and success by setting *ok to true. - - This function ignores leading and trailing whitespace. - - \sa toString() -*/ - -uint TQLocale::toUInt(const TQString &s, bool *ok) const -{ - TQ_ULLONG i = toULongLong(s, ok); - if (i > UINT_MAX) { - if (ok != 0) - *ok = FALSE; - return 0; - } - return (uint) i; -} - -/*! - Returns the long int represented by the localized string \a s, or - 0 if the conversion failed. - - If \a ok is not 0, reports failure by setting - *ok to false and success by setting *ok to true. - - This function ignores leading and trailing whitespace. - - \sa toString() -*/ - -TQ_LONG TQLocale::toLong(const TQString &s, bool *ok) const -{ - TQ_LLONG i = toLongLong(s, ok); - if (i < LONG_MIN || i > LONG_MAX) { - if (ok != 0) - *ok = FALSE; - return 0; - } - return (TQ_LONG) i; -} - -/*! - Returns the unsigned long int represented by the localized string - \a s, or 0 if the conversion failed. - - If \a ok is not 0, reports failure by setting - *ok to false and success by setting *ok to true. - - This function ignores leading and trailing whitespace. - - \sa toString() -*/ - -TQ_ULONG TQLocale::toULong(const TQString &s, bool *ok) const -{ - TQ_ULLONG i = toULongLong(s, ok); - if (i > ULONG_MAX) { - if (ok != 0) - *ok = FALSE; - return 0; - } - return (TQ_ULONG) i; -} - -/*! - Returns the long long int represented by the localized string \a - s, or 0 if the conversion failed. - - If \a ok is not 0, reports failure by setting - *ok to false and success by setting *ok to true. - - This function ignores leading and trailing whitespace. - - \sa toString() -*/ - - -TQ_LLONG TQLocale::toLongLong(const TQString &s, bool *ok) const -{ - return d->stringToLongLong(s, 0, ok, TQLocalePrivate::ParseGroupSeparators); -} - -/*! - Returns the unsigned long long int represented by the localized - string \a s, or 0 if the conversion failed. - - If \a ok is not 0, reports failure by setting - *ok to false and success by setting *ok to true. - - This function ignores leading and trailing whitespace. - - \sa toString() -*/ - - -TQ_ULLONG TQLocale::toULongLong(const TQString &s, bool *ok) const -{ - return d->stringToUnsLongLong(s, 0, ok, TQLocalePrivate::ParseGroupSeparators); -} - -/*! - Returns the float represented by the localized string \a s, or 0.0 - if the conversion failed. - - If \a ok is not 0, reports failure by setting - *ok to false and success by setting *ok to true. - - This function ignores leading and trailing whitespace. - - \sa toString() -*/ - -#define TQT_MAX_FLOAT 3.4028234663852886e+38 - -float TQLocale::toFloat(const TQString &s, bool *ok) const -{ - bool myOk; - double d = toDouble(s, &myOk); - if (!myOk || d > TQT_MAX_FLOAT || d < -TQT_MAX_FLOAT) { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - if (ok != 0) - *ok = TRUE; - return (float) d; -} - -/*! - Returns the double represented by the localized string \a s, or - 0.0 if the conversion failed. - - If \a ok is not 0, reports failure by setting - *ok to false and success by setting *ok to true. - - Unlike TQString::toDouble(), this function does not fall back to - the "C" locale if the string cannot be interpreted in this - locale. - - \code - bool ok; - double d; - - TQLocale c(TQLocale::C); - d = c.toDouble( "1234.56", &ok ); // ok == true, d == 1234.56 - d = c.toDouble( "1,234.56", &ok ); // ok == true, d == 1234.56 - d = c.toDouble( "1234,56", &ok ); // ok == false - - TQLocale german(TQLocale::German); - d = german.toDouble( "1234,56", &ok ); // ok == true, d == 1234.56 - d = german.toDouble( "1.234,56", &ok ); // ok == true, d == 1234.56 - d = german.toDouble( "1234.56", &ok ); // ok == false - - d = german.toDouble( "1.234", &ok ); // ok == true, d == 1234.0 - \endcode - - Notice that the last conversion returns 1234.0, because '.' is the - thousands group separator in the German locale. - - This function ignores leading and trailing whitespace. - - \sa toString() TQString::toDouble() -*/ - -double TQLocale::toDouble(const TQString &s, bool *ok) const -{ - return d->stringToDouble(s, ok, TQLocalePrivate::ParseGroupSeparators); -} - -/*! - Returns a localized string representation of \a i. - - \sa toLongLong() -*/ - -TQString TQLocale::toString(TQ_LLONG i) const -{ - return d->longLongToString(i, -1, 10, -1, TQLocalePrivate::ThousandsGroup); -} - -/*! - \overload - - \sa toULongLong() -*/ - -TQString TQLocale::toString(TQ_ULLONG i) const -{ - return d->unsLongLongToString(i, -1, 10, -1, TQLocalePrivate::ThousandsGroup); -} - -static bool qIsUpper(char c) -{ - return c >= 'A' && c <= 'Z'; -} - -static char qToLower(char c) -{ - if (c >= 'A' && c <= 'Z') - return c - 'A' + 'a'; - else - return c; -} - -/*! - \overload - - \a f and \a prec have the same meaning as in TQString::number(double, char, int). - - \sa toDouble() -*/ - -TQString TQLocale::toString(double i, char f, int prec) const -{ - TQLocalePrivate::DoubleForm form = TQLocalePrivate::DFDecimal; - uint flags = 0; - - if (qIsUpper(f)) - flags = TQLocalePrivate::CapitalEorX; - f = qToLower(f); - - switch (f) { - case 'f': - form = TQLocalePrivate::DFDecimal; - break; - case 'e': - form = TQLocalePrivate::DFExponent; - break; - case 'g': - form = TQLocalePrivate::DFSignificantDigits; - break; - default: - break; - } - - flags |= TQLocalePrivate::ThousandsGroup; - return d->doubleToString(i, prec, form, -1, flags); -} - -/*! - \fn TQLocale TQLocale::c() - - Returns a TQLocale object initialized to the "C" locale. - - \sa system() -*/ - -/*! - Returns a TQLocale object initialized to the system locale. -*/ - -TQLocale TQLocale::system() -{ -#ifdef TQ_OS_UNIX - const char *s = getenv("LC_NUMERIC"); - if (s == 0) - s = getenv("LC_ALL"); - if (s != 0) - return TQLocale(s); -#endif - return TQLocale(TQLocalePrivate::systemLocaleName()); -} - -/*! -\fn TQString TQLocale::toString(short i) const - -\overload - -\sa toShort() -*/ - -/*! -\fn TQString TQLocale::toString(ushort i) const - -\overload - -\sa toUShort() -*/ - -/*! -\fn TQString TQLocale::toString(int i) const - -\overload - -\sa toInt() -*/ - -/*! -\fn TQString TQLocale::toString(uint i) const - -\overload - -\sa toUInt() -*/ - -/*! -\fn TQString TQLocale::toString(TQ_LONG i) const - -\overload - -\sa toLong() -*/ - -/*! -\fn TQString TQLocale::toString(TQ_ULONG i) const - -\overload - -\sa toULong() -*/ - -/*! -\fn TQString TQLocale::toString(float i, char f = 'g', int prec = 6) const - -\overload - -\a f and \a prec have the same meaning as in TQString::number(double, char, int). - -\sa toDouble() -*/ - - -bool TQLocalePrivate::isDigit(TQChar d) const -{ - return zero().tqunicode() <= d.tqunicode() - && zero().tqunicode() + 10 > d.tqunicode(); -} - -static char digitToCLocale(TQChar zero, TQChar d) -{ - if (zero.tqunicode() <= d.tqunicode() - && zero.tqunicode() + 10 > d.tqunicode()) - return '0' + d.tqunicode() - zero.tqunicode(); - - qWarning("TQLocalePrivate::digitToCLocale(): bad digit: row=%d, cell=%d", d.row(), d.cell()); - return TQChar(0); -} - -static TQString qulltoa(TQ_ULLONG l, int base, const TQLocalePrivate &locale) -{ - TQChar buff[65]; // length of MAX_ULLONG in base 2 - TQChar *p = buff + 65; - - if (base != 10 || locale.zero().tqunicode() == '0') { - while (l != 0) { - int c = l % base; - - --p; - - if (c < 10) - *p = '0' + c; - else - *p = c - 10 + 'a'; - - l /= base; - } - } - else { - while (l != 0) { - int c = l % base; - - *(--p) = locale.zero().tqunicode() + c; - - l /= base; - } - } - - return TQString(p, 65 - (p - buff)); -} - -static TQString qlltoa(TQ_LLONG l, int base, const TQLocalePrivate &locale) -{ - return qulltoa(l < 0 ? -l : l, base, locale); -} - -enum PrecisionMode { - PMDecimalDigits = 0x01, - PMSignificantDigits = 0x02, - PMChopTrailingZeros = 0x03 -}; - -static TQString &decimalForm(TQString &digits, int decpt, uint precision, - PrecisionMode pm, - bool always_show_decpt, - bool thousands_group, - const TQLocalePrivate &locale) -{ - if (decpt < 0) { - for (int i = 0; i < -decpt; ++i) - digits.prepend(locale.zero()); - decpt = 0; - } - else if ((uint)decpt > digits.length()) { - for (uint i = digits.length(); i < (uint)decpt; ++i) - digits.append(locale.zero()); - } - - if (pm == PMDecimalDigits) { - uint decimal_digits = digits.length() - decpt; - for (uint i = decimal_digits; i < precision; ++i) - digits.append(locale.zero()); - } - else if (pm == PMSignificantDigits) { - for (uint i = digits.length(); i < precision; ++i) - digits.append(locale.zero()); - } - else { // pm == PMChopTrailingZeros - } - - if (always_show_decpt || (uint)decpt < digits.length()) - digits.insert(decpt, locale.decimal()); - - if (thousands_group) { - for (int i = decpt - 3; i > 0; i -= 3) - digits.insert(i, locale.group()); - } - - if (decpt == 0) - digits.prepend(locale.zero()); - - return digits; -} - -static TQString &exponentForm(TQString &digits, int decpt, uint precision, - PrecisionMode pm, - bool always_show_decpt, - const TQLocalePrivate &locale) -{ - int exp = decpt - 1; - - if (pm == PMDecimalDigits) { - for (uint i = digits.length(); i < precision + 1; ++i) - digits.append(locale.zero()); - } - else if (pm == PMSignificantDigits) { - for (uint i = digits.length(); i < precision; ++i) - digits.append(locale.zero()); - } - else { // pm == PMChopTrailingZeros - } - - if (always_show_decpt || digits.length() > 1) - digits.insert(1, locale.decimal()); - - digits.append(locale.exponential()); - digits.append(locale.longLongToString(exp, 2, 10, - -1, TQLocalePrivate::AlwaysShowSign)); - - return digits; -} - -static bool isZero(double d) -{ - uchar *ch = (uchar *)&d; - if (ByteOrder == BigEndian) { - return !(ch[0] & 0x7F || ch[1] || ch[2] || ch[3] || ch[4] || ch[5] || ch[6] || ch[7]); - } else { - return !(ch[7] & 0x7F || ch[6] || ch[5] || ch[4] || ch[3] || ch[2] || ch[1] || ch[0]); - } -} - -TQString TQLocalePrivate::doubleToString(double d, - int precision, - DoubleForm form, - int width, - unsigned flags) const -{ - if (precision == -1) - precision = 6; - if (width == -1) - width = 0; - - bool negative = FALSE; - bool special_number = FALSE; // nan, +/-inf - TQString num_str; - -#ifdef TQ_OS_WIN - // Detect special numbers (nan, +/-inf) - if (qIsInf(d)) { - num_str = infinity(); - special_number = TRUE; - negative = d < 0; - } else if (qIsNan(d)) { - num_str = nan(); - special_number = TRUE; - } -#else - // Comparing directly to INFINITY gives weird results on some systems. - double tmp_infinity = INFINITY; - - // Detect special numbers (nan, +/-inf) - if (d == tmp_infinity || d == -tmp_infinity) { - num_str = infinity(); - special_number = TRUE; - negative = d < 0; - } else if (qIsNan(d)) { - num_str = nan(); - special_number = TRUE; - } -#endif - - // Handle normal numbers - if (!special_number) { - int decpt, sign; - TQString digits; - -#ifdef TQT_TQLOCALE_USES_FCVT -#ifdef TQT_THREAD_SUPPORT - static bool dummy_for_mutex; - TQMutex *fcvt_mutex = tqt_global_mutexpool ? tqt_global_mutexpool->get( &dummy_for_mutex ) : 0; -# define FCVT_LOCK if (fcvt_mutex) fcvt_mutex->lock() -# define FCVT_UNLOCK if (fcvt_mutex) fcvt_mutex->unlock() -#else -# define FCVT_LOCK -# define FCVT_UNLOCK -#endif - if (form == DFDecimal) { - FCVT_LOCK; - digits = fcvt(d, precision, &decpt, &sign); - FCVT_UNLOCK; - } else { - int pr = precision; - if (form == DFExponent) - ++pr; - else if (form == DFSignificantDigits && pr == 0) - pr = 1; - FCVT_LOCK; - digits = ecvt(d, pr, &decpt, &sign); - FCVT_UNLOCK; - - // Chop trailing zeros - if (digits.length() > 0) { - int last_nonzero_idx = digits.length() - 1; - while (last_nonzero_idx > 0 - && digits.tqunicode()[last_nonzero_idx] == '0') - --last_nonzero_idx; - digits.truncate(last_nonzero_idx + 1); - } - - } - -#else - int mode; - if (form == DFDecimal) - mode = 3; - else - mode = 2; - - /* This next bit is a bit quirky. In DFExponent form, the precision - is the number of digits after decpt. So that would suggest using - mode=3 for qdtoa. But qdtoa behaves strangely when mode=3 and - precision=0. So we get around this by using mode=2 and reasoning - that we want precision+1 significant digits, since the decimal - point in this mode is always after the first digit. */ - int pr = precision; - if (form == DFExponent) - ++pr; - - char *rve = 0; - char *buff = 0; - digits = qdtoa(d, mode, pr, &decpt, &sign, &rve, &buff); - if (buff != 0) - free(buff); -#endif // TQT_TQLOCALE_USES_FCVT - - if (zero().tqunicode() != '0') { - for (uint i = 0; i < digits.length(); ++i) - digits.ref(i).unicode() += zero().tqunicode() - '0'; - } - - bool always_show_decpt = flags & Alternate; - switch (form) { - case DFExponent: { - num_str = exponentForm(digits, decpt, precision, PMDecimalDigits, - always_show_decpt, *this); - break; - } - case DFDecimal: { - num_str = decimalForm(digits, decpt, precision, PMDecimalDigits, - always_show_decpt, flags & ThousandsGroup, - *this); - break; - } - case DFSignificantDigits: { - PrecisionMode mode = (flags & Alternate) ? - PMSignificantDigits : PMChopTrailingZeros; - - if (decpt != (int)digits.length() && (decpt <= -4 || decpt > (int)precision)) - num_str = exponentForm(digits, decpt, precision, mode, - always_show_decpt, *this); - else - num_str = decimalForm(digits, decpt, precision, mode, - always_show_decpt, flags & ThousandsGroup, - *this); - break; - } - } - - negative = sign != 0 && !isZero(d); - } - - // pad with zeros. LeftAdjusted overrides this flag). Also, we don't - // pad special numbers - if (flags & TQLocalePrivate::ZeroPadded - && !(flags & TQLocalePrivate::LeftAdjusted) - && !special_number) { - int num_pad_chars = width - (int)num_str.length(); - // leave space for the sign - if (negative - || flags & TQLocalePrivate::AlwaysShowSign - || flags & TQLocalePrivate::BlankBeforePositive) - --num_pad_chars; - - for (int i = 0; i < num_pad_chars; ++i) - num_str.prepend(zero()); - } - - // add sign - if (negative) - num_str.prepend(minus()); - else if (flags & TQLocalePrivate::AlwaysShowSign) - num_str.prepend(plus()); - else if (flags & TQLocalePrivate::BlankBeforePositive) - num_str.prepend(' '); - - if (flags & TQLocalePrivate::CapitalEorX) - num_str = num_str.upper(); - - return num_str; -} - -TQString TQLocalePrivate::longLongToString(TQ_LLONG l, int precision, - int base, int width, - unsigned flags) const -{ - bool precision_not_specified = FALSE; - if (precision == -1) { - precision_not_specified = TRUE; - precision = 1; - } - - bool negative = l < 0; - if (base != 10) { - // these are not suported by sprintf for octal and hex - flags &= ~AlwaysShowSign; - flags &= ~BlankBeforePositive; - negative = FALSE; // neither are negative numbers - } - - TQString num_str; - if (base == 10) - num_str = qlltoa(l, base, *this); - else - num_str = qulltoa(l, base, *this); - - uint cnt_thousand_sep = 0; - if (flags & ThousandsGroup && base == 10) { - for (int i = (int)num_str.length() - 3; i > 0; i -= 3) { - num_str.insert(i, group()); - ++cnt_thousand_sep; - } - } - - for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i) - num_str.prepend(base == 10 ? zero() : TQChar('0')); - - if (flags & Alternate - && base == 8 - && (num_str.isEmpty() - || num_str[0].unicode() != '0')) - num_str.prepend('0'); - - // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds - // when precision is not specified in the format string - bool zero_padded = flags & ZeroPadded - && !(flags & LeftAdjusted) - && precision_not_specified; - - if (zero_padded) { - int num_pad_chars = width - (int)num_str.length(); - - // leave space for the sign - if (negative - || flags & AlwaysShowSign - || flags & BlankBeforePositive) - --num_pad_chars; - - // leave space for optional '0x' in hex form - if (base == 16 - && flags & Alternate - && l != 0) - num_pad_chars -= 2; - - for (int i = 0; i < num_pad_chars; ++i) - num_str.prepend(base == 10 ? zero() : TQChar('0')); - } - - if (base == 16 - && flags & Alternate - && l != 0) - num_str.prepend("0x"); - - // add sign - if (negative) - num_str.prepend(minus()); - else if (flags & AlwaysShowSign) - num_str.prepend(base == 10 ? plus() : TQChar('+')); - else if (flags & BlankBeforePositive) - num_str.prepend(' '); - - if (flags & CapitalEorX) - num_str = num_str.upper(); - - return num_str; -} - -TQString TQLocalePrivate::unsLongLongToString(TQ_ULLONG l, int precision, - int base, int width, - unsigned flags) const -{ - bool precision_not_specified = FALSE; - if (precision == -1) { - precision_not_specified = TRUE; - precision = 1; - } - - TQString num_str = qulltoa(l, base, *this); - - uint cnt_thousand_sep = 0; - if (flags & ThousandsGroup && base == 10) { - for (int i = (int)num_str.length() - 3; i > 0; i -=3) { - num_str.insert(i, group()); - ++cnt_thousand_sep; - } - } - - for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i) - num_str.prepend(base == 10 ? zero() : TQChar('0')); - - if (flags & Alternate - && base == 8 - && (num_str.isEmpty() - || num_str[0].unicode() != '0')) - num_str.prepend('0'); - - // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds - // when precision is not specified in the format string - bool zero_padded = flags & ZeroPadded - && !(flags & LeftAdjusted) - && precision_not_specified; - - if (zero_padded) { - int num_pad_chars = width - (int)num_str.length(); - - // leave space for optional '0x' in hex form - if (base == 16 - && flags & Alternate - && l != 0) - num_pad_chars -= 2; - - for (int i = 0; i < num_pad_chars; ++i) - num_str.prepend(base == 10 ? zero() : TQChar('0')); - } - - if (base == 16 - && flags & Alternate - && l != 0) - num_str.prepend("0x"); - - if (flags & CapitalEorX) - num_str = num_str.upper(); - - return num_str; -} - -static inline bool isLatin1Digit(const TQChar &c) -{ - return c.tqunicode() >= '0' && c.tqunicode() <= '9'; -} - -// Removes thousand-group separators, ie. the ',' in "1,234,567.89e-5" -bool TQLocalePrivate::removeGroupSeparators(TQString &num_str) const -{ - int group_cnt = 0; // counts number of group chars - int decpt_idx = -1; - - // Find the decimal point and check if there are any group chars - uint i = 0; - for (; i < num_str.length(); ++i) { - TQChar c = num_str.tqunicode()[i]; - - if (c.tqunicode() == ',') { - // check that there are digits before and after the separator - if (i == 0 || !isLatin1Digit(num_str.tqunicode()[i - 1])) - return FALSE; - if (i == num_str.length() + 1 || !isLatin1Digit(num_str.tqunicode()[i + 1])) - return FALSE; - ++group_cnt; - } - else if (c.tqunicode() == '.') { - // Fail if more than one decimal points - if (decpt_idx != -1) - return FALSE; - decpt_idx = i; - } else if (c.tqunicode() == 'e' || c.tqunicode() == 'E') { - // an 'e' or 'E' - if we have not encountered a decimal - // point, this is where it "is". - if (decpt_idx == -1) - decpt_idx = i; - } - } - - // If no group chars, we're done - if (group_cnt == 0) - return TRUE; - - // No decimal point means that it "is" at the end of the string - if (decpt_idx == -1) - decpt_idx = num_str.length(); - - i = 0; - while (i < num_str.length() && group_cnt > 0) { - TQChar c = num_str.tqunicode()[i]; - - if (c.tqunicode() == ',') { - // Don't allow group chars after the decimal point - if ((int)i > decpt_idx) - return FALSE; - - // Check that it is placed correctly relative to the decpt - if ((decpt_idx - i) % 4 != 0) - return FALSE; - - // Remove it - num_str.remove(i, 1); - - --group_cnt; - --decpt_idx; // adjust decpt_idx - } else { - // Check that we are not missing a separator - if ((int)i < decpt_idx && (decpt_idx - i) % 4 == 0) - return FALSE; - ++i; - } - } - - return TRUE; -} - -static void stripWhiteSpaceInPlace(TQString &s) -{ - uint i = 0; - while (i < s.length() && s.tqunicode()[i].isSpace()) - ++i; - if (i > 0) - s.remove(0, i); - - i = s.length(); - - if (i == 0) - return; - --i; - while (i > 0 && s.tqunicode()[i].isSpace()) - --i; - if (i + 1 < s.length()) - s.truncate(i + 1); -} - -/* - Converts a number in locale to its representation in the C locale. - Only has to guarantee that a string that is a correct representation of - a number will be converted. If junk is passed in, junk will be passed - out and the error will be detected during the actual conversion to a - number. We can't detect junk here, since we don't even know the base - of the number. -*/ -bool TQLocalePrivate::numberToCLocale(TQString &l_num, - GroupSeparatorMode group_sep_mode) const -{ - stripWhiteSpaceInPlace(l_num); - - if (l_num.isEmpty()) - return FALSE; - - for (uint idx = 0; idx < l_num.length(); ++idx) { - TQChar c = l_num.ref(idx); - - if (isDigit(c)) - c = digitToCLocale(zero(), c); - else if (c == plus()) - c = '+'; - else if (c == minus()) - c = '-'; - else if (c == decimal()) - c = '.'; - else if (c == group()) - c = ','; - // In several languages group() is the char 0xA0, which looks like a space. - // People use a regular space instead of it and complain it doesn't work. - else if (group().tqunicode() == 0xA0 && c.tqunicode() == ' ') - c = ','; - else if (c == exponential() || c == exponential().upper()) - c = 'e'; - else if (c == list()) - c = ';'; - else if (c == percent()) - c = '%'; - else if (c.tqunicode() >= 'A' && c.tqunicode() <= 'Z') - c = c.lower(); - else if (c.tqunicode() >= 'a' && c.tqunicode() <= 'z') - ; // do nothing - else - return FALSE; - } - - if (group_sep_mode == ParseGroupSeparators - && !removeGroupSeparators(l_num)) - return FALSE; - - return TRUE; -} - -double TQLocalePrivate::stringToDouble(TQString num, - bool *ok, - GroupSeparatorMode group_sep_mode) const -{ - if (!numberToCLocale(num, group_sep_mode)) { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - - if (ok != 0) - *ok = TRUE; - - if (num == "nan") - return NAN; - - if (num == "+inf" - || num == "inf") - return INFINITY; - - if (num == "-inf") - return -INFINITY; - - bool _ok; - const char *num_buff = num.latin1(); - -#ifdef TQT_TQLOCALE_USES_FCVT - char *endptr; - double d = strtod(num_buff, &endptr); - _ok = TRUE; -#else - const char *endptr; - double d = qstrtod(num_buff, &endptr, &_ok); -#endif - - if (!_ok || *endptr != '\0') { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - else - return d; -} - -TQ_LLONG TQLocalePrivate::stringToLongLong(TQString num, int base, - bool *ok, - GroupSeparatorMode group_sep_mode) const -{ - if (!numberToCLocale(num, group_sep_mode)) { - if (ok != 0) - *ok = FALSE; - return 0; - } - - bool _ok; - const char *endptr; - const char *num_buff = num.latin1(); - TQ_LLONG l = qstrtoll(num_buff, &endptr, base, &_ok); - - if (!_ok || *endptr != '\0') { - if (ok != 0) - *ok = FALSE; - return 0; - } - - if (ok != 0) - *ok = TRUE; - return l; -} - -TQ_ULLONG TQLocalePrivate::stringToUnsLongLong(TQString num, int base, - bool *ok, - GroupSeparatorMode group_sep_mode) const -{ - if (!numberToCLocale(num, group_sep_mode)) { - if (ok != 0) - *ok = FALSE; - return 0; - } - - bool _ok; - const char *endptr; - const char *num_buff = num.latin1(); - TQ_ULLONG l = qstrtoull(num_buff, &endptr, base, &_ok); - - if (!_ok || *endptr != '\0') { - if (ok != 0) - *ok = FALSE; - return 0; - } - - if (ok != 0) - *ok = TRUE; - return l; -} - -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSETQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -// static char sccsid[] = "@(#)strtouq.c 8.1 (Berkeley) 6/4/93"; -// "$FreeBSD: src/lib/libc/stdlib/strtoull.c,v 1.5.2.1 2001/03/02 09:45:20 obrien Exp $"; - -/* - * Convert a string to an TQ_ULLONG integer. - * - * Ignores `locale' stuff. Assumes that the upper and lower case - * alphabets and digits are each contiguous. - */ -static TQ_ULLONG qstrtoull(const char *nptr, const char **endptr, register int base, bool *ok) -{ - register const char *s = nptr; - register TQ_ULLONG acc; - register unsigned char c; - register TQ_ULLONG qbase, cutoff; - register int neg, any, cutlim; - - if (ok != 0) - *ok = TRUE; - - /* - * See strtoq for comments as to the logic used. - */ - s = nptr; - do { - c = *s++; - } while (isspace(c)); - if (c == '-') { - if (ok != 0) - *ok = FALSE; - if (endptr != 0) - *endptr = s - 1; - return 0; - } else { - neg = 0; - if (c == '+') - c = *s++; - } - if ((base == 0 || base == 16) && - c == '0' && (*s == 'x' || *s == 'X')) { - c = s[1]; - s += 2; - base = 16; - } - if (base == 0) - base = c == '0' ? 8 : 10; - qbase = (unsigned)base; - cutoff = (TQ_ULLONG)ULLONG_MAX / qbase; - cutlim = (TQ_ULLONG)ULLONG_MAX % qbase; - for (acc = 0, any = 0;; c = *s++) { - if (!isascii(c)) - break; - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) - c -= isupper(c) ? 'A' - 10 : 'a' - 10; - else - break; - if (c >= base) - break; - if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) - any = -1; - else { - any = 1; - acc *= qbase; - acc += c; - } - } - if (any < 0) { - acc = ULLONG_MAX; - if (ok != 0) - *ok = FALSE; - } - else if (neg) - acc = (~acc) + 1; - if (endptr != 0) - *endptr = (char *)(any ? s - 1 : nptr); - return (acc); -} - - -// "$FreeBSD: src/lib/libc/stdlib/strtoll.c,v 1.5.2.1 2001/03/02 09:45:20 obrien Exp $"; - - -/* - * Convert a string to a TQ_LLONG integer. - * - * Ignores `locale' stuff. Assumes that the upper and lower case - * alphabets and digits are each contiguous. - */ -static TQ_LLONG qstrtoll(const char *nptr, const char **endptr, register int base, bool *ok) -{ - register const char *s; - register TQ_ULLONG acc; - register unsigned char c; - register TQ_ULLONG qbase, cutoff; - register int neg, any, cutlim; - - if (ok != 0) - *ok = TRUE; - - /* - * Skip white space and pick up leading +/- sign if any. - * If base is 0, allow 0x for hex and 0 for octal, else - * assume decimal; if base is already 16, allow 0x. - */ - s = nptr; - do { - c = *s++; - } while (isspace(c)); - if (c == '-') { - neg = 1; - c = *s++; - } else { - neg = 0; - if (c == '+') - c = *s++; - } - if ((base == 0 || base == 16) && - c == '0' && (*s == 'x' || *s == 'X')) { - c = s[1]; - s += 2; - base = 16; - } - if (base == 0) - base = c == '0' ? 8 : 10; - - /* - * Compute the cutoff value between legal numbers and illegal - * numbers. That is the largest legal value, divided by the - * base. An input number that is greater than this value, if - * followed by a legal input character, is too big. One that - * is equal to this value may be valid or not; the limit - * between valid and invalid numbers is then based on the last - * digit. For instance, if the range for quads is - * [-9223372036854775808..9223372036854775807] and the input base - * is 10, cutoff will be set to 922337203685477580 and cutlim to - * either 7 (neg==0) or 8 (neg==1), meaning that if we have - * accumulated a value > 922337203685477580, or equal but the - * next digit is > 7 (or 8), the number is too big, and we will - * return a range error. - * - * Set any if any `digits' consumed; make it negative to indicate - * overflow. - */ - qbase = (unsigned)base; - cutoff = neg ? (TQ_ULLONG)-(LLONG_MIN + LLONG_MAX) + LLONG_MAX - : LLONG_MAX; - cutlim = cutoff % qbase; - cutoff /= qbase; - for (acc = 0, any = 0;; c = *s++) { - if (!isascii(c)) - break; - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) - c -= isupper(c) ? 'A' - 10 : 'a' - 10; - else - break; - if (c >= base) - break; - if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) - any = -1; - else { - any = 1; - acc *= qbase; - acc += c; - } - } - if (any < 0) { - acc = neg ? LLONG_MIN : LLONG_MAX; - if (ok != 0) - *ok = FALSE; - } else if (neg) { - acc = (~acc) + 1; - } - if (endptr != 0) - *endptr = (char *)(any ? s - 1 : nptr); - return (acc); -} - -#ifndef TQT_TQLOCALE_USES_FCVT - -/* From: NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp */ -/* $FreeBSD: src/lib/libc/stdlib/netbsd_strtod.c,v 1.2.2.2 2001/03/02 17:14:15 tegge Exp $ */ - -/* Please send bug reports to - David M. Gay - AT&T Bell Laboratories, Room 2C-463 - 600 Mountain Avenue - Murray Hill, NJ 07974-2070 - U.S.A. - dmg@research.att.com or research!dmg - */ - -/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. - * - * This strtod returns a nearest machine number to the input decimal - * string (or sets errno to ERANGE). With IEEE arithmetic, ties are - * broken by the IEEE round-even rule. Otherwise ties are broken by - * biased rounding (add half and chop). - * - * Inspired loosely by William D. Clinger's paper "How to Read Floating - * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. - * - * Modifications: - * - * 1. We only require IEEE, IBM, or VAX double-precision - * arithmetic (not IEEE double-extended). - * 2. We get by with floating-point arithmetic in a case that - * Clinger missed -- when we're computing d * 10^n - * for a small integer d and the integer n is not too - * much larger than 22 (the maximum integer k for which - * we can represent 10^k exactly), we may be able to - * compute (d*10^k) * 10^(e-k) with just one roundoff. - * 3. Rather than a bit-at-a-time adjustment of the binary - * result in the hard case, we use floating-point - * arithmetic to determine the adjustment to within - * one bit; only in really hard cases do we need to - * compute a second residual. - * 4. Because of 3., we don't need a large table of powers of 10 - * for ten-to-e (just some small tables, e.g. of 10^k - * for 0 <= k <= 22). - */ - -/* - * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least - * significant byte has the lowest address. - * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most - * significant byte has the lowest address. - * #define Long int on machines with 32-bit ints and 64-bit longs. - * #define Sudden_Underflow for IEEE-format machines without gradual - * underflow (i.e., that flush to zero on underflow). - * #define IBM for IBM mainframe-style floating-point arithmetic. - * #define VAX for VAX-style floating-point arithmetic. - * #define Unsigned_Shifts if >> does treats its left operand as unsigned. - * #define No_leftright to omit left-right logic in fast floating-point - * computation of dtoa. - * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3. - * #define RND_PRODTQUOT to use rnd_prod and rnd_quot (assembly routines - * that use extended-precision instructions to compute rounded - * products and quotients) with IBM. - * #define ROUND_BIASED for IEEE-format with biased rounding. - * #define Inaccurate_Divide for IEEE-format with correctly rounded - * products but inaccurate quotients, e.g., for Intel i860. - * #define Just_16 to store 16 bits per 32-bit Long when doing high-precision - * integer arithmetic. Whether this speeds things up or slows things - * down depends on the machine and the number being converted. - * #define KR_headers for old-style C function headers. - * #define Bad_float_h if your system lacks a float.h or if it does not - * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, - * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. - * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) - * if memory is available and otherwise does something you deem - * appropriate. If MALLOC is undefined, malloc will be invoked - * directly -- and assumed always to succeed. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp $"); -#endif /* LIBC_SCCS and not lint */ - -/* -#if defined(__m68k__) || defined(__sparc__) || defined(__i386__) || \ - defined(__mips__) || defined(__ns32k__) || defined(__alpha__) || \ - defined(__powerpc__) || defined(TQ_OS_WIN) || defined(TQ_OS_DARWIN) || defined(TQ_OS_MACX) || \ - defined(mips) || defined(TQ_OS_AIX) || defined(TQ_OS_SOLARIS) -# define IEEE_BIG_OR_LITTLE_ENDIAN 1 -#endif -*/ - -// *All* of our architectures have IEEE arithmetic, don't they? -#define IEEE_BIG_OR_LITTLE_ENDIAN 1 - -#ifdef __arm32__ -/* - * Although the CPU is little endian the FP has different - * byte and word endianness. The byte order is still little endian - * but the word order is big endian. - */ -#define IEEE_BIG_OR_LITTLE_ENDIAN -#endif - -#ifdef vax -#define VAX -#endif - -#define Long TQ_INT32 -#define ULong TQ_UINT32 - -#define MALLOC malloc -#define CONST const - -#ifdef BSD_TQDTOA_DEBUG -#include <stdio.h> -#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} -#endif - -#ifdef Unsigned_Shifts -#define Sign_Extend(a,b) if (b < 0) a |= 0xffff0000; -#else -#define Sign_Extend(a,b) /*no-op*/ -#endif - -#if (defined(IEEE_BIG_OR_LITTLE_ENDIAN) + defined(VAX) + defined(IBM)) != 1 -#error Exactly one of IEEE_BIG_OR_LITTLE_ENDIAN, VAX, or IBM should be defined. -#endif - -inline ULong getWord0(const NEEDS_VOLATILE double x) -{ - const NEEDS_VOLATILE uchar *ptr = reinterpret_cast<const NEEDS_VOLATILE uchar *>(&x); - if (ByteOrder == BigEndian) { - return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3]; - } else { - return (ptr[7]<<24) + (ptr[6]<<16) + (ptr[5]<<8) + ptr[4]; - } -} - -inline void setWord0(NEEDS_VOLATILE double *x, ULong l) -{ - NEEDS_VOLATILE uchar *ptr = reinterpret_cast<NEEDS_VOLATILE uchar *>(x); - if (ByteOrder == BigEndian) { - ptr[0] = (uchar)(l>>24); - ptr[1] = (uchar)(l>>16); - ptr[2] = (uchar)(l>>8); - ptr[3] = (uchar)l; - } else { - ptr[7] = (uchar)(l>>24); - ptr[6] = (uchar)(l>>16); - ptr[5] = (uchar)(l>>8); - ptr[4] = (uchar)l; - } -} - -inline ULong getWord1(const NEEDS_VOLATILE double x) -{ - const NEEDS_VOLATILE uchar *ptr = reinterpret_cast<const NEEDS_VOLATILE uchar *>(&x); - if (ByteOrder == BigEndian) { - return (ptr[4]<<24) + (ptr[5]<<16) + (ptr[6]<<8) + ptr[7]; - } else { - return (ptr[3]<<24) + (ptr[2]<<16) + (ptr[1]<<8) + ptr[0]; - } -} -inline void setWord1(NEEDS_VOLATILE double *x, ULong l) -{ - NEEDS_VOLATILE uchar *ptr = reinterpret_cast<uchar NEEDS_VOLATILE *>(x); - if (ByteOrder == BigEndian) { - ptr[4] = (uchar)(l>>24); - ptr[5] = (uchar)(l>>16); - ptr[6] = (uchar)(l>>8); - ptr[7] = (uchar)l; - } else { - ptr[3] = (uchar)(l>>24); - ptr[2] = (uchar)(l>>16); - ptr[1] = (uchar)(l>>8); - ptr[0] = (uchar)l; - } -} - -static inline void Storeinc(ULong *&a, const ULong &b, const ULong &c) -{ - - *a = (((unsigned short)b) << 16) | ((unsigned short)c); - ++a; -} - -/* #define P DBL_MANT_DIG */ -/* Ten_pmax = floor(P*log(2)/log(5)) */ -/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ -/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ -/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ - -#if defined(IEEE_BIG_OR_LITTLE_ENDIAN) -#define Exp_shift 20 -#define Exp_shift1 20 -#define Exp_msk1 0x100000 -#define Exp_msk11 0x100000 -#define Exp_mask 0x7ff00000 -#define P 53 -#define Bias 1023 -#define IEEE_Arith -#define Emin (-1022) -#define Exp_1 0x3ff00000 -#define Exp_11 0x3ff00000 -#define Ebits 11 -#define Frac_mask 0xfffff -#define Frac_mask1 0xfffff -#define Ten_pmax 22 -#define Bletch 0x10 -#define Bndry_mask 0xfffff -#define Bndry_mask1 0xfffff -#define LSB 1 -#define Sign_bit 0x80000000 -#define Log2P 1 -#define Tiny0 0 -#define Tiny1 1 -#define Quick_max 14 -#define Int_max 14 -#define Infinite(x) (getWord0(x) == 0x7ff00000) /* sufficient test for here */ -#else -#undef Sudden_Underflow -#define Sudden_Underflow -#ifdef IBM -#define Exp_shift 24 -#define Exp_shift1 24 -#define Exp_msk1 0x1000000 -#define Exp_msk11 0x1000000 -#define Exp_mask 0x7f000000 -#define P 14 -#define Bias 65 -#define Exp_1 0x41000000 -#define Exp_11 0x41000000 -#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ -#define Frac_mask 0xffffff -#define Frac_mask1 0xffffff -#define Bletch 4 -#define Ten_pmax 22 -#define Bndry_mask 0xefffff -#define Bndry_mask1 0xffffff -#define LSB 1 -#define Sign_bit 0x80000000 -#define Log2P 4 -#define Tiny0 0x100000 -#define Tiny1 0 -#define Quick_max 14 -#define Int_max 15 -#else /* VAX */ -#define Exp_shift 23 -#define Exp_shift1 7 -#define Exp_msk1 0x80 -#define Exp_msk11 0x800000 -#define Exp_mask 0x7f80 -#define P 56 -#define Bias 129 -#define Exp_1 0x40800000 -#define Exp_11 0x4080 -#define Ebits 8 -#define Frac_mask 0x7fffff -#define Frac_mask1 0xffff007f -#define Ten_pmax 24 -#define Bletch 2 -#define Bndry_mask 0xffff007f -#define Bndry_mask1 0xffff007f -#define LSB 0x10000 -#define Sign_bit 0x8000 -#define Log2P 1 -#define Tiny0 0x80 -#define Tiny1 0 -#define Quick_max 15 -#define Int_max 15 -#endif -#endif - -#ifndef IEEE_Arith -#define ROUND_BIASED -#endif - -#ifdef RND_PRODTQUOT -#define rounded_product(a,b) a = rnd_prod(a, b) -#define rounded_quotient(a,b) a = rnd_quot(a, b) -extern double rnd_prod(double, double), rnd_quot(double, double); -#else -#define rounded_product(a,b) a *= b -#define rounded_quotient(a,b) a /= b -#endif - -#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) -#define Big1 0xffffffff - -#ifndef Just_16 -/* When Pack_32 is not defined, we store 16 bits per 32-bit Long. - * This makes some inner loops simpler and sometimes saves work - * during multiplications, but it often seems to make things slightly - * slower. Hence the default is now to store 32 bits per Long. - */ -#ifndef Pack_32 -#define Pack_32 -#endif -#endif - -#define Kmax 15 - -struct -Bigint { - struct Bigint *next; - int k, maxwds, sign, wds; - ULong x[1]; -}; - - typedef struct Bigint Bigint; - -static Bigint *Balloc(int k) -{ - int x; - Bigint *rv; - - x = 1 << k; - rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(Long)); - rv->k = k; - rv->maxwds = x; - rv->sign = rv->wds = 0; - return rv; -} - -static void Bfree(Bigint *v) -{ - free(v); -} - -#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ -y->wds*sizeof(Long) + 2*sizeof(int)) - -/* multiply by m and add a */ -static Bigint *multadd(Bigint *b, int m, int a) -{ - int i, wds; - ULong *x, y; -#ifdef Pack_32 - ULong xi, z; -#endif - Bigint *b1; - - wds = b->wds; - x = b->x; - i = 0; - do { -#ifdef Pack_32 - xi = *x; - y = (xi & 0xffff) * m + a; - z = (xi >> 16) * m + (y >> 16); - a = (int)(z >> 16); - *x++ = (z << 16) + (y & 0xffff); -#else - y = *x * m + a; - a = (int)(y >> 16); - *x++ = y & 0xffff; -#endif - } - while(++i < wds); - if (a) { - if (wds >= b->maxwds) { - b1 = Balloc(b->k+1); - Bcopy(b1, b); - Bfree(b); - b = b1; - } - b->x[wds++] = a; - b->wds = wds; - } - return b; -} - -static Bigint *s2b(CONST char *s, int nd0, int nd, ULong y9) -{ - Bigint *b; - int i, k; - Long x, y; - - x = (nd + 8) / 9; - for(k = 0, y = 1; x > y; y <<= 1, k++) ; -#ifdef Pack_32 - b = Balloc(k); - b->x[0] = y9; - b->wds = 1; -#else - b = Balloc(k+1); - b->x[0] = y9 & 0xffff; - b->wds = (b->x[1] = y9 >> 16) ? 2 : 1; -#endif - - i = 9; - if (9 < nd0) { - s += 9; - do b = multadd(b, 10, *s++ - '0'); - while(++i < nd0); - s++; - } - else - s += 10; - for(; i < nd; i++) - b = multadd(b, 10, *s++ - '0'); - return b; -} - -static int hi0bits(ULong x) -{ - int k = 0; - - if (!(x & 0xffff0000)) { - k = 16; - x <<= 16; - } - if (!(x & 0xff000000)) { - k += 8; - x <<= 8; - } - if (!(x & 0xf0000000)) { - k += 4; - x <<= 4; - } - if (!(x & 0xc0000000)) { - k += 2; - x <<= 2; - } - if (!(x & 0x80000000)) { - k++; - if (!(x & 0x40000000)) - return 32; - } - return k; -} - -static int lo0bits(ULong *y) -{ - int k; - ULong x = *y; - - if (x & 7) { - if (x & 1) - return 0; - if (x & 2) { - *y = x >> 1; - return 1; - } - *y = x >> 2; - return 2; - } - k = 0; - if (!(x & 0xffff)) { - k = 16; - x >>= 16; - } - if (!(x & 0xff)) { - k += 8; - x >>= 8; - } - if (!(x & 0xf)) { - k += 4; - x >>= 4; - } - if (!(x & 0x3)) { - k += 2; - x >>= 2; - } - if (!(x & 1)) { - k++; - x >>= 1; - if (!x & 1) - return 32; - } - *y = x; - return k; -} - -static Bigint *i2b(int i) -{ - Bigint *b; - - b = Balloc(1); - b->x[0] = i; - b->wds = 1; - return b; -} - -static Bigint *mult(Bigint *a, Bigint *b) -{ - Bigint *c; - int k, wa, wb, wc; - ULong carry, y, z; - ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; -#ifdef Pack_32 - ULong z2; -#endif - - if (a->wds < b->wds) { - c = a; - a = b; - b = c; - } - k = a->k; - wa = a->wds; - wb = b->wds; - wc = wa + wb; - if (wc > a->maxwds) - k++; - c = Balloc(k); - for(x = c->x, xa = x + wc; x < xa; x++) - *x = 0; - xa = a->x; - xae = xa + wa; - xb = b->x; - xbe = xb + wb; - xc0 = c->x; -#ifdef Pack_32 - for(; xb < xbe; xb++, xc0++) { - if ((y = *xb & 0xffff) != 0) { - x = xa; - xc = xc0; - carry = 0; - do { - z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; - carry = z >> 16; - z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; - carry = z2 >> 16; - Storeinc(xc, z2, z); - } - while(x < xae); - *xc = carry; - } - if ((y = *xb >> 16) != 0) { - x = xa; - xc = xc0; - carry = 0; - z2 = *xc; - do { - z = (*x & 0xffff) * y + (*xc >> 16) + carry; - carry = z >> 16; - Storeinc(xc, z, z2); - z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; - carry = z2 >> 16; - } - while(x < xae); - *xc = z2; - } - } -#else - for(; xb < xbe; xc0++) { - if (y = *xb++) { - x = xa; - xc = xc0; - carry = 0; - do { - z = *x++ * y + *xc + carry; - carry = z >> 16; - *xc++ = z & 0xffff; - } - while(x < xae); - *xc = carry; - } - } -#endif - for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; - c->wds = wc; - return c; -} - -static Bigint *p5s; - -static Bigint *pow5mult(Bigint *b, int k) -{ - Bigint *b1, *p5, *p51; - int i; - static const int p05[3] = { 5, 25, 125 }; - - if ((i = k & 3) != 0) - b = multadd(b, p05[i-1], 0); - - if (!(k >>= 2)) - return b; - if (!(p5 = p5s)) { - /* first time */ - p5 = p5s = i2b(625); - p5->next = 0; - } - for(;;) { - if (k & 1) { - b1 = mult(b, p5); - Bfree(b); - b = b1; - } - if (!(k >>= 1)) - break; - if (!(p51 = p5->next)) { - p51 = p5->next = mult(p5,p5); - p51->next = 0; - } - p5 = p51; - } - return b; -} - -static Bigint *lshift(Bigint *b, int k) -{ - int i, k1, n, n1; - Bigint *b1; - ULong *x, *x1, *xe, z; - -#ifdef Pack_32 - n = k >> 5; -#else - n = k >> 4; -#endif - k1 = b->k; - n1 = n + b->wds + 1; - for(i = b->maxwds; n1 > i; i <<= 1) - k1++; - b1 = Balloc(k1); - x1 = b1->x; - for(i = 0; i < n; i++) - *x1++ = 0; - x = b->x; - xe = x + b->wds; -#ifdef Pack_32 - if (k &= 0x1f) { - k1 = 32 - k; - z = 0; - do { - *x1++ = *x << k | z; - z = *x++ >> k1; - } - while(x < xe); - if ((*x1 = z) != 0) - ++n1; - } -#else - if (k &= 0xf) { - k1 = 16 - k; - z = 0; - do { - *x1++ = *x << k & 0xffff | z; - z = *x++ >> k1; - } - while(x < xe); - if (*x1 = z) - ++n1; - } -#endif - else do - *x1++ = *x++; - while(x < xe); - b1->wds = n1 - 1; - Bfree(b); - return b1; -} - -static int cmp(Bigint *a, Bigint *b) -{ - ULong *xa, *xa0, *xb, *xb0; - int i, j; - - i = a->wds; - j = b->wds; -#ifdef BSD_TQDTOA_DEBUG - if (i > 1 && !a->x[i-1]) - Bug("cmp called with a->x[a->wds-1] == 0"); - if (j > 1 && !b->x[j-1]) - Bug("cmp called with b->x[b->wds-1] == 0"); -#endif - if (i -= j) - return i; - xa0 = a->x; - xa = xa0 + j; - xb0 = b->x; - xb = xb0 + j; - for(;;) { - if (*--xa != *--xb) - return *xa < *xb ? -1 : 1; - if (xa <= xa0) - break; - } - return 0; -} - -static Bigint *diff(Bigint *a, Bigint *b) -{ - Bigint *c; - int i, wa, wb; - Long borrow, y; /* We need signed shifts here. */ - ULong *xa, *xae, *xb, *xbe, *xc; -#ifdef Pack_32 - Long z; -#endif - - i = cmp(a,b); - if (!i) { - c = Balloc(0); - c->wds = 1; - c->x[0] = 0; - return c; - } - if (i < 0) { - c = a; - a = b; - b = c; - i = 1; - } - else - i = 0; - c = Balloc(a->k); - c->sign = i; - wa = a->wds; - xa = a->x; - xae = xa + wa; - wb = b->wds; - xb = b->x; - xbe = xb + wb; - xc = c->x; - borrow = 0; -#ifdef Pack_32 - do { - y = (*xa & 0xffff) - (*xb & 0xffff) + borrow; - borrow = y >> 16; - Sign_Extend(borrow, y); - z = (*xa++ >> 16) - (*xb++ >> 16) + borrow; - borrow = z >> 16; - Sign_Extend(borrow, z); - Storeinc(xc, z, y); - } - while(xb < xbe); - while(xa < xae) { - y = (*xa & 0xffff) + borrow; - borrow = y >> 16; - Sign_Extend(borrow, y); - z = (*xa++ >> 16) + borrow; - borrow = z >> 16; - Sign_Extend(borrow, z); - Storeinc(xc, z, y); - } -#else - do { - y = *xa++ - *xb++ + borrow; - borrow = y >> 16; - Sign_Extend(borrow, y); - *xc++ = y & 0xffff; - } - while(xb < xbe); - while(xa < xae) { - y = *xa++ + borrow; - borrow = y >> 16; - Sign_Extend(borrow, y); - *xc++ = y & 0xffff; - } -#endif - while(!*--xc) - wa--; - c->wds = wa; - return c; -} - -static double ulp(double x) -{ - Long L; - double a; - - L = (getWord0(x) & Exp_mask) - (P-1)*Exp_msk1; -#ifndef Sudden_Underflow - if (L > 0) { -#endif -#ifdef IBM - L |= Exp_msk1 >> 4; -#endif - setWord0(&a, L); - setWord1(&a, 0); -#ifndef Sudden_Underflow - } - else { - L = -L >> Exp_shift; - if (L < Exp_shift) { - setWord0(&a, 0x80000 >> L); - setWord1(&a, 0); - } - else { - setWord0(&a, 0); - L -= Exp_shift; - setWord1(&a, L >= 31 ? 1U : 1U << (31 - L)); - } - } -#endif - return a; -} - -static double b2d(Bigint *a, int *e) -{ - ULong *xa, *xa0, w, y, z; - int k; - double d; - - xa0 = a->x; - xa = xa0 + a->wds; - y = *--xa; -#ifdef BSD_TQDTOA_DEBUG - if (!y) Bug("zero y in b2d"); -#endif - k = hi0bits(y); - *e = 32 - k; -#ifdef Pack_32 - if (k < Ebits) { - setWord0(&d, Exp_1 | y >> (Ebits - k)); - w = xa > xa0 ? *--xa : 0; - setWord1(&d, y << ((32-Ebits) + k) | w >> (Ebits - k)); - goto ret_d; - } - z = xa > xa0 ? *--xa : 0; - if (k -= Ebits) { - setWord0(&d, Exp_1 | y << k | z >> (32 - k)); - y = xa > xa0 ? *--xa : 0; - setWord1(&d, z << k | y >> (32 - k)); - } - else { - setWord0(&d, Exp_1 | y); - setWord1(&d, z); - } -#else - if (k < Ebits + 16) { - z = xa > xa0 ? *--xa : 0; - setWord0(&d, Exp_1 | y << k - Ebits | z >> Ebits + 16 - k); - w = xa > xa0 ? *--xa : 0; - y = xa > xa0 ? *--xa : 0; - setWord1(&d, z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k); - goto ret_d; - } - z = xa > xa0 ? *--xa : 0; - w = xa > xa0 ? *--xa : 0; - k -= Ebits + 16; - setWord0(&d, Exp_1 | y << k + 16 | z << k | w >> 16 - k); - y = xa > xa0 ? *--xa : 0; - setWord1(&d, w << k + 16 | y << k); -#endif - ret_d: - return d; -} - -static Bigint *d2b(double d, int *e, int *bits) -{ - Bigint *b; - int de, i, k; - ULong *x, y, z; - -#ifdef Pack_32 - b = Balloc(1); -#else - b = Balloc(2); -#endif - x = b->x; - - z = getWord0(d) & Frac_mask; - setWord0(&d, getWord0(d) & 0x7fffffff); /* clear sign bit, which we ignore */ -#ifdef Sudden_Underflow - de = (int)(getWord0(d) >> Exp_shift); -#ifndef IBM - z |= Exp_msk11; -#endif -#else - if ((de = (int)(getWord0(d) >> Exp_shift)) != 0) - z |= Exp_msk1; -#endif -#ifdef Pack_32 - if ((y = getWord1(d)) != 0) { - if ((k = lo0bits(&y)) != 0) { - x[0] = y | z << (32 - k); - z >>= k; - } - else - x[0] = y; - i = b->wds = (x[1] = z) ? 2 : 1; - } - else { -#ifdef BSD_TQDTOA_DEBUG - if (!z) - Bug("Zero passed to d2b"); -#endif - k = lo0bits(&z); - x[0] = z; - i = b->wds = 1; - k += 32; - } -#else - if (y = getWord1(d)) { - if (k = lo0bits(&y)) - if (k >= 16) { - x[0] = y | z << 32 - k & 0xffff; - x[1] = z >> k - 16 & 0xffff; - x[2] = z >> k; - i = 2; - } - else { - x[0] = y & 0xffff; - x[1] = y >> 16 | z << 16 - k & 0xffff; - x[2] = z >> k & 0xffff; - x[3] = z >> k+16; - i = 3; - } - else { - x[0] = y & 0xffff; - x[1] = y >> 16; - x[2] = z & 0xffff; - x[3] = z >> 16; - i = 3; - } - } - else { -#ifdef BSD_TQDTOA_DEBUG - if (!z) - Bug("Zero passed to d2b"); -#endif - k = lo0bits(&z); - if (k >= 16) { - x[0] = z; - i = 0; - } - else { - x[0] = z & 0xffff; - x[1] = z >> 16; - i = 1; - } - k += 32; - } - while(!x[i]) - --i; - b->wds = i + 1; -#endif -#ifndef Sudden_Underflow - if (de) { -#endif -#ifdef IBM - *e = (de - Bias - (P-1) << 2) + k; - *bits = 4*P + 8 - k - hi0bits(getWord0(d) & Frac_mask); -#else - *e = de - Bias - (P-1) + k; - *bits = P - k; -#endif -#ifndef Sudden_Underflow - } - else { - *e = de - Bias - (P-1) + 1 + k; -#ifdef Pack_32 - *bits = 32*i - hi0bits(x[i-1]); -#else - *bits = (i+2)*16 - hi0bits(x[i]); -#endif - } -#endif - return b; -} - -static double ratio(Bigint *a, Bigint *b) -{ - double da, db; - int k, ka, kb; - - da = b2d(a, &ka); - db = b2d(b, &kb); -#ifdef Pack_32 - k = ka - kb + 32*(a->wds - b->wds); -#else - k = ka - kb + 16*(a->wds - b->wds); -#endif -#ifdef IBM - if (k > 0) { - setWord0(&da, getWord0(da) + (k >> 2)*Exp_msk1); - if (k &= 3) - da *= 1 << k; - } - else { - k = -k; - setWord0(&db, getWord0(db) + (k >> 2)*Exp_msk1); - if (k &= 3) - db *= 1 << k; - } -#else - if (k > 0) - setWord0(&da, getWord0(da) + k*Exp_msk1); - else { - k = -k; - setWord0(&db, getWord0(db) + k*Exp_msk1); - } -#endif - return da / db; -} - -static CONST double tens[] = { - 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, - 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, - 1e20, 1e21, 1e22 -#ifdef VAX - , 1e23, 1e24 -#endif -}; - -#ifdef IEEE_Arith -static CONST double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; -static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 }; -#define n_bigtens 5 -#else -#ifdef IBM -static CONST double bigtens[] = { 1e16, 1e32, 1e64 }; -static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 }; -#define n_bigtens 3 -#else -static CONST double bigtens[] = { 1e16, 1e32 }; -static CONST double tinytens[] = { 1e-16, 1e-32 }; -#define n_bigtens 2 -#endif -#endif - -/* - The pre-release gcc3.3 shipped with SuSE 8.2 has a bug which causes - the comparison 1e-100 == 0.0 to return true. As a workaround, we - compare it to a global variable containing 0.0, which produces - correct assembler output. - - ### consider detecting the broken compilers and using the static - ### double for these, and use a #define for all working compilers -*/ -static double g_double_zero = 0.0; - -static double qstrtod(CONST char *s00, CONST char **se, bool *ok) -{ - int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, - e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; - CONST char *s, *s0, *s1; - double aadj, aadj1, adj, rv, rv0; - Long L; - ULong y, z; - Bigint *bb1, *bd0; - Bigint *bb = NULL, *bd = NULL, *bs = NULL, *delta = NULL;/* pacify gcc */ - - /* - #ifndef KR_headers - CONST char decimal_point = localeconv()->decimal_point[0]; - #else - CONST char decimal_point = '.'; - #endif */ - if (ok != 0) - *ok = TRUE; - - CONST char decimal_point = '.'; - - sign = nz0 = nz = 0; - rv = 0.; - - - for(s = s00; isspace((unsigned char) *s); s++) - ; - - if (*s == '-') { - sign = 1; - s++; - } else if (*s == '+') { - s++; - } - - if (*s == '\0') { - s = s00; - goto ret; - } - - if (*s == '0') { - nz0 = 1; - while(*++s == '0') ; - if (!*s) - goto ret; - } - s0 = s; - y = z = 0; - for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) - if (nd < 9) - y = 10*y + c - '0'; - else if (nd < 16) - z = 10*z + c - '0'; - nd0 = nd; - if (c == decimal_point) { - c = *++s; - if (!nd) { - for(; c == '0'; c = *++s) - nz++; - if (c > '0' && c <= '9') { - s0 = s; - nf += nz; - nz = 0; - goto have_dig; - } - goto dig_done; - } - for(; c >= '0' && c <= '9'; c = *++s) { - have_dig: - nz++; - if (c -= '0') { - nf += nz; - for(i = 1; i < nz; i++) - if (nd++ < 9) - y *= 10; - else if (nd <= DBL_DIG + 1) - z *= 10; - if (nd++ < 9) - y = 10*y + c; - else if (nd <= DBL_DIG + 1) - z = 10*z + c; - nz = 0; - } - } - } - dig_done: - e = 0; - if (c == 'e' || c == 'E') { - if (!nd && !nz && !nz0) { - s = s00; - goto ret; - } - s00 = s; - esign = 0; - switch(c = *++s) { - case '-': - esign = 1; - case '+': - c = *++s; - } - if (c >= '0' && c <= '9') { - while(c == '0') - c = *++s; - if (c > '0' && c <= '9') { - L = c - '0'; - s1 = s; - while((c = *++s) >= '0' && c <= '9') - L = 10*L + c - '0'; - if (s - s1 > 8 || L > 19999) - /* Avoid confusion from exponents - * so large that e might overflow. - */ - e = 19999; /* safe for 16 bit ints */ - else - e = (int)L; - if (esign) - e = -e; - } - else - e = 0; - } - else - s = s00; - } - if (!nd) { - if (!nz && !nz0) - s = s00; - goto ret; - } - e1 = e -= nf; - - /* Now we have nd0 digits, starting at s0, followed by a - * decimal point, followed by nd-nd0 digits. The number we're - * after is the integer represented by those digits times - * 10**e */ - - if (!nd0) - nd0 = nd; - k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; - rv = y; - if (k > 9) - rv = tens[k - 9] * rv + z; - bd0 = 0; - if (nd <= DBL_DIG -#ifndef RND_PRODTQUOT - && FLT_ROUNDS == 1 -#endif - ) { - if (!e) - goto ret; - if (e > 0) { - if (e <= Ten_pmax) { -#ifdef VAX - goto vax_ovfl_check; -#else - /* rv = */ rounded_product(rv, tens[e]); - goto ret; -#endif - } - i = DBL_DIG - nd; - if (e <= Ten_pmax + i) { - /* A fancier test would sometimes let us do - * this for larger i values. - */ - e -= i; - rv *= tens[i]; -#ifdef VAX - /* VAX exponent range is so narrow we must - * worry about overflow here... - */ - vax_ovfl_check: - setWord0(&rv, getWord0(rv) - P*Exp_msk1); - /* rv = */ rounded_product(rv, tens[e]); - if ((getWord0(rv) & Exp_mask) - > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) - goto ovfl; - setWord0(&rv, getWord0(rv) + P*Exp_msk1); -#else - /* rv = */ rounded_product(rv, tens[e]); -#endif - goto ret; - } - } -#ifndef Inaccurate_Divide - else if (e >= -Ten_pmax) { - /* rv = */ rounded_quotient(rv, tens[-e]); - goto ret; - } -#endif - } - e1 += nd - k; - - /* Get starting approximation = rv * 10**e1 */ - - if (e1 > 0) { - if ((i = e1 & 15) != 0) - rv *= tens[i]; - if (e1 &= ~15) { - if (e1 > DBL_MAX_10_EXP) { - ovfl: - // errno = ERANGE; - if (ok != 0) - *ok = FALSE; -#ifdef __STDC__ - rv = HUGE_VAL; -#else - /* Can't trust HUGE_VAL */ -#ifdef IEEE_Arith - setWord0(&rv, Exp_mask); - setWord1(&rv, 0); -#else - setWord0(&rv, Big0); - setWord1(&rv, Big1); -#endif -#endif - if (bd0) - goto retfree; - goto ret; - } - if (e1 >>= 4) { - for(j = 0; e1 > 1; j++, e1 >>= 1) - if (e1 & 1) - rv *= bigtens[j]; - /* The last multiplication could overflow. */ - setWord0(&rv, getWord0(rv) - P*Exp_msk1); - rv *= bigtens[j]; - if ((z = getWord0(rv) & Exp_mask) - > Exp_msk1*(DBL_MAX_EXP+Bias-P)) - goto ovfl; - if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { - /* set to largest number */ - /* (Can't trust DBL_MAX) */ - setWord0(&rv, Big0); - setWord1(&rv, Big1); - } - else - setWord0(&rv, getWord0(rv) + P*Exp_msk1); - } - - } - } - else if (e1 < 0) { - e1 = -e1; - if ((i = e1 & 15) != 0) - rv /= tens[i]; - if (e1 &= ~15) { - e1 >>= 4; - if (e1 >= 1 << n_bigtens) - goto undfl; - for(j = 0; e1 > 1; j++, e1 >>= 1) - if (e1 & 1) - rv *= tinytens[j]; - /* The last multiplication could underflow. */ - rv0 = rv; - rv *= tinytens[j]; - if (rv == g_double_zero) - { - rv = 2.*rv0; - rv *= tinytens[j]; - if (rv == g_double_zero) - { - undfl: - rv = 0.; - // errno = ERANGE; - if (ok != 0) - *ok = FALSE; - if (bd0) - goto retfree; - goto ret; - } - setWord0(&rv, Tiny0); - setWord1(&rv, Tiny1); - /* The refinement below will clean - * this approximation up. - */ - } - } - } - - /* Now the hard part -- adjusting rv to the correct value.*/ - - /* Put digits into bd: true value = bd * 10^e */ - - bd0 = s2b(s0, nd0, nd, y); - - for(;;) { - bd = Balloc(bd0->k); - Bcopy(bd, bd0); - bb = d2b(rv, &bbe, &bbbits); /* rv = bb * 2^bbe */ - bs = i2b(1); - - if (e >= 0) { - bb2 = bb5 = 0; - bd2 = bd5 = e; - } - else { - bb2 = bb5 = -e; - bd2 = bd5 = 0; - } - if (bbe >= 0) - bb2 += bbe; - else - bd2 -= bbe; - bs2 = bb2; -#ifdef Sudden_Underflow -#ifdef IBM - j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); -#else - j = P + 1 - bbbits; -#endif -#else - i = bbe + bbbits - 1; /* logb(rv) */ - if (i < Emin) /* denormal */ - j = bbe + (P-Emin); - else - j = P + 1 - bbbits; -#endif - bb2 += j; - bd2 += j; - i = bb2 < bd2 ? bb2 : bd2; - if (i > bs2) - i = bs2; - if (i > 0) { - bb2 -= i; - bd2 -= i; - bs2 -= i; - } - if (bb5 > 0) { - bs = pow5mult(bs, bb5); - bb1 = mult(bs, bb); - Bfree(bb); - bb = bb1; - } - if (bb2 > 0) - bb = lshift(bb, bb2); - if (bd5 > 0) - bd = pow5mult(bd, bd5); - if (bd2 > 0) - bd = lshift(bd, bd2); - if (bs2 > 0) - bs = lshift(bs, bs2); - delta = diff(bb, bd); - dsign = delta->sign; - delta->sign = 0; - i = cmp(delta, bs); - if (i < 0) { - /* Error is less than half an ulp -- check for - * special case of mantissa a power of two. - */ - if (dsign || getWord1(rv) || getWord0(rv) & Bndry_mask) - break; - delta = lshift(delta,Log2P); - if (cmp(delta, bs) > 0) - goto drop_down; - break; - } - if (i == 0) { - /* exactly half-way between */ - if (dsign) { - if ((getWord0(rv) & Bndry_mask1) == Bndry_mask1 - && getWord1(rv) == 0xffffffff) { - /*boundary case -- increment exponent*/ - setWord0(&rv, (getWord0(rv) & Exp_mask) - + Exp_msk1 -#ifdef IBM - | Exp_msk1 >> 4 -#endif - ); - setWord1(&rv, 0); - break; - } - } - else if (!(getWord0(rv) & Bndry_mask) && !getWord1(rv)) { - drop_down: - /* boundary case -- decrement exponent */ -#ifdef Sudden_Underflow - L = getWord0(rv) & Exp_mask; -#ifdef IBM - if (L < Exp_msk1) -#else - if (L <= Exp_msk1) -#endif - goto undfl; - L -= Exp_msk1; -#else - L = (getWord0(rv) & Exp_mask) - Exp_msk1; -#endif - setWord0(&rv, L | Bndry_mask1); - setWord1(&rv, 0xffffffff); -#ifdef IBM - goto cont; -#else - break; -#endif - } -#ifndef ROUND_BIASED - if (!(getWord1(rv) & LSB)) - break; -#endif - if (dsign) - rv += ulp(rv); -#ifndef ROUND_BIASED - else { - rv -= ulp(rv); -#ifndef Sudden_Underflow - if (rv == g_double_zero) - goto undfl; -#endif - } -#endif - break; - } - if ((aadj = ratio(delta, bs)) <= 2.) { - if (dsign) - aadj = aadj1 = 1.; - else if (getWord1(rv) || getWord0(rv) & Bndry_mask) { -#ifndef Sudden_Underflow - if (getWord1(rv) == Tiny1 && !getWord0(rv)) - goto undfl; -#endif - aadj = 1.; - aadj1 = -1.; - } - else { - /* special case -- power of FLT_RADIX to be */ - /* rounded down... */ - - if (aadj < 2./FLT_RADIX) - aadj = 1./FLT_RADIX; - else - aadj *= 0.5; - aadj1 = -aadj; - } - } - else { - aadj *= 0.5; - aadj1 = dsign ? aadj : -aadj; -#ifdef Check_FLT_ROUNDS - switch(FLT_ROUNDS) { - case 2: /* towards +infinity */ - aadj1 -= 0.5; - break; - case 0: /* towards 0 */ - case 3: /* towards -infinity */ - aadj1 += 0.5; - } -#else - if (FLT_ROUNDS == 0) - aadj1 += 0.5; -#endif - } - y = getWord0(rv) & Exp_mask; - - /* Check for overflow */ - - if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { - rv0 = rv; - setWord0(&rv, getWord0(rv) - P*Exp_msk1); - adj = aadj1 * ulp(rv); - rv += adj; - if ((getWord0(rv) & Exp_mask) >= - Exp_msk1*(DBL_MAX_EXP+Bias-P)) { - if (getWord0(rv0) == Big0 && getWord1(rv0) == Big1) - goto ovfl; - setWord0(&rv, Big0); - setWord1(&rv, Big1); - goto cont; - } - else - setWord0(&rv, getWord0(rv) + P*Exp_msk1); - } - else { -#ifdef Sudden_Underflow - if ((getWord0(rv) & Exp_mask) <= P*Exp_msk1) { - rv0 = rv; - setWord0(&rv, getWord0(rv) + P*Exp_msk1); - adj = aadj1 * ulp(rv); - rv += adj; -#ifdef IBM - if ((getWord0(rv) & Exp_mask) < P*Exp_msk1) -#else - if ((getWord0(rv) & Exp_mask) <= P*Exp_msk1) -#endif - { - if (getWord0(rv0) == Tiny0 - && getWord1(rv0) == Tiny1) - goto undfl; - setWord0(&rv, Tiny0); - setWord1(&rv, Tiny1); - goto cont; - } - else - setWord0(&rv, getWord0(rv) - P*Exp_msk1); - } - else { - adj = aadj1 * ulp(rv); - rv += adj; - } -#else - /* Compute adj so that the IEEE rounding rules will - * correctly round rv + adj in some half-way cases. - * If rv * ulp(rv) is denormalized (i.e., - * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid - * trouble from bits lost to denormalization; - * example: 1.2e-307 . - */ - if (y <= (P-1)*Exp_msk1 && aadj >= 1.) { - aadj1 = (double)(int)(aadj + 0.5); - if (!dsign) - aadj1 = -aadj1; - } - adj = aadj1 * ulp(rv); - rv += adj; -#endif - } - z = getWord0(rv) & Exp_mask; - if (y == z) { - /* Can we stop now? */ - L = (Long) aadj; - aadj -= L; - /* The tolerances below are conservative. */ - if (dsign || getWord1(rv) || getWord0(rv) & Bndry_mask) { - if (aadj < .4999999 || aadj > .5000001) - break; - } - else if (aadj < .4999999/FLT_RADIX) - break; - } - cont: - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(delta); - } - retfree: - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(bd0); - Bfree(delta); - ret: - if (se) - *se = (char *)s; - return sign ? -rv : rv; -} - -static int quorem(Bigint *b, Bigint *S) -{ - int n; - Long borrow, y; - ULong carry, q, ys; - ULong *bx, *bxe, *sx, *sxe; -#ifdef Pack_32 - Long z; - ULong si, zs; -#endif - - n = S->wds; -#ifdef BSD_TQDTOA_DEBUG - /*debug*/ if (b->wds > n) - /*debug*/ Bug("oversize b in quorem"); -#endif - if (b->wds < n) - return 0; - sx = S->x; - sxe = sx + --n; - bx = b->x; - bxe = bx + n; - q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ -#ifdef BSD_TQDTOA_DEBUG - /*debug*/ if (q > 9) - /*debug*/ Bug("oversized quotient in quorem"); -#endif - if (q) { - borrow = 0; - carry = 0; - do { -#ifdef Pack_32 - si = *sx++; - ys = (si & 0xffff) * q + carry; - zs = (si >> 16) * q + (ys >> 16); - carry = zs >> 16; - y = (*bx & 0xffff) - (ys & 0xffff) + borrow; - borrow = y >> 16; - Sign_Extend(borrow, y); - z = (*bx >> 16) - (zs & 0xffff) + borrow; - borrow = z >> 16; - Sign_Extend(borrow, z); - Storeinc(bx, z, y); -#else - ys = *sx++ * q + carry; - carry = ys >> 16; - y = *bx - (ys & 0xffff) + borrow; - borrow = y >> 16; - Sign_Extend(borrow, y); - *bx++ = y & 0xffff; -#endif - } - while(sx <= sxe); - if (!*bxe) { - bx = b->x; - while(--bxe > bx && !*bxe) - --n; - b->wds = n; - } - } - if (cmp(b, S) >= 0) { - q++; - borrow = 0; - carry = 0; - bx = b->x; - sx = S->x; - do { -#ifdef Pack_32 - si = *sx++; - ys = (si & 0xffff) + carry; - zs = (si >> 16) + (ys >> 16); - carry = zs >> 16; - y = (*bx & 0xffff) - (ys & 0xffff) + borrow; - borrow = y >> 16; - Sign_Extend(borrow, y); - z = (*bx >> 16) - (zs & 0xffff) + borrow; - borrow = z >> 16; - Sign_Extend(borrow, z); - Storeinc(bx, z, y); -#else - ys = *sx++ + carry; - carry = ys >> 16; - y = *bx - (ys & 0xffff) + borrow; - borrow = y >> 16; - Sign_Extend(borrow, y); - *bx++ = y & 0xffff; -#endif - } - while(sx <= sxe); - bx = b->x; - bxe = bx + n; - if (!*bxe) { - while(--bxe > bx && !*bxe) - --n; - b->wds = n; - } - } - return q; -} - -/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. - * - * Inspired by "How to Print Floating-Point Numbers Accurately" by - * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101]. - * - * Modifications: - * 1. Rather than iterating, we use a simple numeric overestimate - * to determine k = floor(log10(d)). We scale relevant - * quantities using O(log2(k)) rather than O(k) multiplications. - * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't - * try to generate digits strictly left to right. Instead, we - * compute with fewer bits and propagate the carry if necessary - * when rounding the final digit up. This is often faster. - * 3. Under the assumption that input will be rounded nearest, - * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. - * That is, we allow equality in stopping tests when the - * round-nearest rule will give the same floating-point value - * as would satisfaction of the stopping test with strict - * inequality. - * 4. We remove common factors of powers of 2 from relevant - * quantities. - * 5. When converting floating-point integers less than 1e16, - * we use floating-point arithmetic rather than resorting - * to multiple-precision integers. - * 6. When asked to produce fewer than 15 digits, we first try - * to get by with floating-point arithmetic; we resort to - * multiple-precision integer arithmetic only if we cannot - * guarantee that the floating-point calculation has given - * the correctly rounded result. For k requested digits and - * "uniformly" distributed input, the probability is - * something like 10^(k-15) that we must resort to the Long - * calculation. - */ - - -/* This actually sometimes returns a pointer to a string literal - cast to a char*. Do NOT try to modify the return value. */ - -static char *qdtoa ( double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp) -{ - // Some values of the floating-point control word can cause _qdtoa to crash with an underflow. - // We set a safe value here. -#ifdef TQ_OS_WIN -#ifndef TQ_CC_BOR - unsigned int oldbits = _control87(0, 0); -#ifndef _M_X64 //x64 does not support precition control - _control87(0x9001F, 0xFFFFF); -#else - _control87(0x9001F, _MCW_DN|_MCW_EM|_MCW_RC); -#endif //_M_X64 -#endif -#endif - -#ifdef TQ_OS_LINUX - fenv_t envp; - feholdexcept(&envp); -#endif - - char *s = _qdtoa(d, mode, ndigits, decpt, sign, rve, resultp); - -#ifdef TQ_OS_WIN -#ifndef TQ_CC_BOR - _clear87(); -#ifndef _M_X64 - _control87(oldbits, 0xFFFFF); -#else - _control87(oldbits, _MCW_DN|_MCW_EM|_MCW_RC); -#endif //_M_X64 -#endif -#endif - -#ifdef TQ_OS_LINUX - fesetenv(&envp); -#endif - - return s; -} - -static char *_qdtoa( NEEDS_VOLATILE double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp) -{ - /* - Arguments ndigits, decpt, sign are similar to those - of ecvt and fcvt; trailing zeros are suppressed from - the returned string. If not null, *rve is set to point - to the end of the return value. If d is +-Infinity or NaN, - then *decpt is set to 9999. - - mode: - 0 ==> shortest string that yields d when read in - and rounded to nearest. - 1 ==> like 0, but with Steele & White stopping rule; - e.g. with IEEE P754 arithmetic , mode 0 gives - 1e23 whereas mode 1 gives 9.999999999999999e22. - 2 ==> max(1,ndigits) significant digits. This gives a - return value similar to that of ecvt, except - that trailing zeros are suppressed. - 3 ==> through ndigits past the decimal point. This - gives a return value similar to that from fcvt, - except that trailing zeros are suppressed, and - ndigits can be negative. - 4-9 should give the same return values as 2-3, i.e., - 4 <= mode <= 9 ==> same return as mode - 2 + (mode & 1). These modes are mainly for - debugging; often they run slower but sometimes - faster than modes 2-3. - 4,5,8,9 ==> left-to-right digit generation. - 6-9 ==> don't try fast floating-point estimate - (if applicable). - - Values of mode other than 0-9 are treated as mode 0. - - Sufficient space is allocated to the return value - to hold the suppressed trailing zeros. - */ - - int bbits, b2, b5, be, dig, i, ieps, ilim0, - j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, - try_quick; - int ilim = 0, ilim1 = 0, spec_case = 0; /* pacify gcc */ - Long L; -#ifndef Sudden_Underflow - int denorm; - ULong x; -#endif - Bigint *b, *b1, *delta, *mhi, *S; - Bigint *mlo = NULL; /* pacify gcc */ - double d2; - double ds, eps; - char *s, *s0; - - if (getWord0(d) & Sign_bit) { - /* set sign for everything, including 0's and NaNs */ - *sign = 1; - setWord0(&d, getWord0(d) & ~Sign_bit); /* clear sign bit */ - } - else - *sign = 0; - -#if defined(IEEE_Arith) + defined(VAX) -#ifdef IEEE_Arith - if ((getWord0(d) & Exp_mask) == Exp_mask) -#else - if (getWord0(d) == 0x8000) -#endif - { - /* Infinity or NaN */ - *decpt = 9999; - s = -#ifdef IEEE_Arith - !getWord1(d) && !(getWord0(d) & 0xfffff) ? (char*)"Infinity" : -#endif - (char*)"NaN"; - if (rve) - *rve = -#ifdef IEEE_Arith - s[3] ? s + 8 : -#endif - s + 3; - return s; - } -#endif -#ifdef IBM - d += 0; /* normalize */ -#endif - if (d == g_double_zero) - { - *decpt = 1; - s = (char*) "0"; - if (rve) - *rve = s + 1; - return s; - } - - b = d2b(d, &be, &bbits); -#ifdef Sudden_Underflow - i = (int)(getWord0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); -#else - if ((i = (int)(getWord0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) != 0) { -#endif - d2 = d; - setWord0(&d2, getWord0(d2) & Frac_mask1); - setWord0(&d2, getWord0(d2) | Exp_11); -#ifdef IBM - if (j = 11 - hi0bits(getWord0(d2) & Frac_mask)) - d2 /= 1 << j; -#endif - - /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 - * log10(x) = log(x) / log(10) - * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) - * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) - * - * This suggests computing an approximation k to log10(d) by - * - * k = (i - Bias)*0.301029995663981 - * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); - * - * We want k to be too large rather than too small. - * The error in the first-order Taylor series approximation - * is in our favor, so we just round up the constant enough - * to compensate for any error in the multiplication of - * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, - * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, - * adding 1e-13 to the constant term more than suffices. - * Hence we adjust the constant term to 0.1760912590558. - * (We could get a more accurate k by invoking log10, - * but this is probably not worthwhile.) - */ - - i -= Bias; -#ifdef IBM - i <<= 2; - i += j; -#endif -#ifndef Sudden_Underflow - denorm = 0; - } - else { - /* d is denormalized */ - - i = bbits + be + (Bias + (P-1) - 1); - x = i > 32 ? getWord0(d) << (64 - i) | getWord1(d) >> (i - 32) - : getWord1(d) << (32 - i); - d2 = x; - setWord0(&d2, getWord0(d2) - 31*Exp_msk1); /* adjust exponent */ - i -= (Bias + (P-1) - 1) + 1; - denorm = 1; - } -#endif - ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; - k = (int)ds; - if (ds < 0. && ds != k) - k--; /* want k = floor(ds) */ - k_check = 1; - if (k >= 0 && k <= Ten_pmax) { - if (d < tens[k]) - k--; - k_check = 0; - } - j = bbits - i - 1; - if (j >= 0) { - b2 = 0; - s2 = j; - } - else { - b2 = -j; - s2 = 0; - } - if (k >= 0) { - b5 = 0; - s5 = k; - s2 += k; - } - else { - b2 -= k; - b5 = -k; - s5 = 0; - } - if (mode < 0 || mode > 9) - mode = 0; - try_quick = 1; - if (mode > 5) { - mode -= 4; - try_quick = 0; - } - leftright = 1; - switch(mode) { - case 0: - case 1: - ilim = ilim1 = -1; - i = 18; - ndigits = 0; - break; - case 2: - leftright = 0; - /* no break */ - case 4: - if (ndigits <= 0) - ndigits = 1; - ilim = ilim1 = i = ndigits; - break; - case 3: - leftright = 0; - /* no break */ - case 5: - i = ndigits + k + 1; - ilim = i; - ilim1 = i - 1; - if (i <= 0) - i = 1; - } - *resultp = (char *) malloc(i + 1); - s = s0 = *resultp; - - if (ilim >= 0 && ilim <= Quick_max && try_quick) { - - /* Try to get by with floating-point arithmetic. */ - - i = 0; - d2 = d; - k0 = k; - ilim0 = ilim; - ieps = 2; /* conservative */ - if (k > 0) { - ds = tens[k&0xf]; - j = k >> 4; - if (j & Bletch) { - /* prevent overflows */ - j &= Bletch - 1; - d /= bigtens[n_bigtens-1]; - ieps++; - } - for(; j; j >>= 1, i++) - if (j & 1) { - ieps++; - ds *= bigtens[i]; - } - d /= ds; - } - else if ((j1 = -k) != 0) { - d *= tens[j1 & 0xf]; - for(j = j1 >> 4; j; j >>= 1, i++) - if (j & 1) { - ieps++; - d *= bigtens[i]; - } - } - if (k_check && d < 1. && ilim > 0) { - if (ilim1 <= 0) - goto fast_failed; - ilim = ilim1; - k--; - d *= 10.; - ieps++; - } - eps = ieps*d + 7.; - setWord0(&eps, getWord0(eps) - (P-1)*Exp_msk1); - if (ilim == 0) { - S = mhi = 0; - d -= 5.; - if (d > eps) - goto one_digit; - if (d < -eps) - goto no_digits; - goto fast_failed; - } -#ifndef No_leftright - if (leftright) { - /* Use Steele & White method of only - * generating digits needed. - */ - eps = 0.5/tens[ilim-1] - eps; - for(i = 0;;) { - L = (Long)d; - d -= L; - *s++ = '0' + (int)L; - if (d < eps) - goto ret1; - if (1. - d < eps) - goto bump_up; - if (++i >= ilim) - break; - eps *= 10.; - d *= 10.; - } - } - else { -#endif - /* Generate ilim digits, then fix them up. */ - eps *= tens[ilim-1]; - for(i = 1;; i++, d *= 10.) { - L = (Long)d; - d -= L; - *s++ = '0' + (int)L; - if (i == ilim) { - if (d > 0.5 + eps) - goto bump_up; - else if (d < 0.5 - eps) { - while(*--s == '0'); - s++; - goto ret1; - } - break; - } - } -#ifndef No_leftright - } -#endif - fast_failed: - s = s0; - d = d2; - k = k0; - ilim = ilim0; - } - - /* Do we have a "small" integer? */ - - if (be >= 0 && k <= Int_max) { - /* Yes. */ - ds = tens[k]; - if (ndigits < 0 && ilim <= 0) { - S = mhi = 0; - if (ilim < 0 || d <= 5*ds) - goto no_digits; - goto one_digit; - } - for(i = 1;; i++) { - L = (Long)(d / ds); - d -= L*ds; -#ifdef Check_FLT_ROUNDS - /* If FLT_ROUNDS == 2, L will usually be high by 1 */ - if (d < 0) { - L--; - d += ds; - } -#endif - *s++ = '0' + (int)L; - if (i == ilim) { - d += d; - if (d > ds || (d == ds && L & 1)) { - bump_up: - while(*--s == '9') - if (s == s0) { - k++; - *s = '0'; - break; - } - ++*s++; - } - break; - } - if ((d *= 10.) == g_double_zero) - break; - } - goto ret1; - } - - m2 = b2; - m5 = b5; - mhi = mlo = 0; - if (leftright) { - if (mode < 2) { - i = -#ifndef Sudden_Underflow - denorm ? be + (Bias + (P-1) - 1 + 1) : -#endif -#ifdef IBM - 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3); -#else - 1 + P - bbits; -#endif - } - else { - j = ilim - 1; - if (m5 >= j) - m5 -= j; - else { - s5 += j -= m5; - b5 += j; - m5 = 0; - } - if ((i = ilim) < 0) { - m2 -= i; - i = 0; - } - } - b2 += i; - s2 += i; - mhi = i2b(1); - } - if (m2 > 0 && s2 > 0) { - i = m2 < s2 ? m2 : s2; - b2 -= i; - m2 -= i; - s2 -= i; - } - if (b5 > 0) { - if (leftright) { - if (m5 > 0) { - mhi = pow5mult(mhi, m5); - b1 = mult(mhi, b); - Bfree(b); - b = b1; - } - if ((j = b5 - m5) != 0) - b = pow5mult(b, j); - } - else - b = pow5mult(b, b5); - } - S = i2b(1); - if (s5 > 0) - S = pow5mult(S, s5); - - /* Check for special case that d is a normalized power of 2. */ - - if (mode < 2) { - if (!getWord1(d) && !(getWord0(d) & Bndry_mask) -#ifndef Sudden_Underflow - && getWord0(d) & Exp_mask -#endif - ) { - /* The special case */ - b2 += Log2P; - s2 += Log2P; - spec_case = 1; - } - else - spec_case = 0; - } - - /* Arrange for convenient computation of quotients: - * shift left if necessary so divisor has 4 leading 0 bits. - * - * Perhaps we should just compute leading 28 bits of S once - * and for all and pass them and a shift to quorem, so it - * can do shifts and ors to compute the numerator for q. - */ -#ifdef Pack_32 - if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) != 0) - i = 32 - i; -#else - if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf) - i = 16 - i; -#endif - if (i > 4) { - i -= 4; - b2 += i; - m2 += i; - s2 += i; - } - else if (i < 4) { - i += 28; - b2 += i; - m2 += i; - s2 += i; - } - if (b2 > 0) - b = lshift(b, b2); - if (s2 > 0) - S = lshift(S, s2); - if (k_check) { - if (cmp(b,S) < 0) { - k--; - b = multadd(b, 10, 0); /* we botched the k estimate */ - if (leftright) - mhi = multadd(mhi, 10, 0); - ilim = ilim1; - } - } - if (ilim <= 0 && mode > 2) { - if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) { - /* no digits, fcvt style */ - no_digits: - k = -1 - ndigits; - goto ret; - } - one_digit: - *s++ = '1'; - k++; - goto ret; - } - if (leftright) { - if (m2 > 0) - mhi = lshift(mhi, m2); - - /* Compute mlo -- check for special case - * that d is a normalized power of 2. - */ - - mlo = mhi; - if (spec_case) { - mhi = Balloc(mhi->k); - Bcopy(mhi, mlo); - mhi = lshift(mhi, Log2P); - } - - for(i = 1;;i++) { - dig = quorem(b,S) + '0'; - /* Do we yet have the shortest decimal string - * that will round to d? - */ - j = cmp(b, mlo); - delta = diff(S, mhi); - j1 = delta->sign ? 1 : cmp(b, delta); - Bfree(delta); -#ifndef ROUND_BIASED - if (j1 == 0 && !mode && !(getWord1(d) & 1)) { - if (dig == '9') - goto round_9_up; - if (j > 0) - dig++; - *s++ = dig; - goto ret; - } -#endif - if (j < 0 || (j == 0 && !mode -#ifndef ROUND_BIASED - && !(getWord1(d) & 1) -#endif - )) { - if (j1 > 0) { - b = lshift(b, 1); - j1 = cmp(b, S); - if ((j1 > 0 || (j1 == 0 && dig & 1)) - && dig++ == '9') - goto round_9_up; - } - *s++ = dig; - goto ret; - } - if (j1 > 0) { - if (dig == '9') { /* possible if i == 1 */ - round_9_up: - *s++ = '9'; - goto roundoff; - } - *s++ = dig + 1; - goto ret; - } - *s++ = dig; - if (i == ilim) - break; - b = multadd(b, 10, 0); - if (mlo == mhi) - mlo = mhi = multadd(mhi, 10, 0); - else { - mlo = multadd(mlo, 10, 0); - mhi = multadd(mhi, 10, 0); - } - } - } - else - for(i = 1;; i++) { - *s++ = dig = quorem(b,S) + '0'; - if (i >= ilim) - break; - b = multadd(b, 10, 0); - } - - /* Round off last digit */ - - b = lshift(b, 1); - j = cmp(b, S); - if (j > 0 || (j == 0 && dig & 1)) { - roundoff: - while(*--s == '9') - if (s == s0) { - k++; - *s++ = '1'; - goto ret; - } - ++*s++; - } - else { - while(*--s == '0'); - s++; - } - ret: - Bfree(S); - if (mhi) { - if (mlo && mlo != mhi) - Bfree(mlo); - Bfree(mhi); - } - ret1: - Bfree(b); - if (s == s0) { /* don't return empty string */ - *s++ = '0'; - k = 0; - } - *s = 0; - *decpt = k + 1; - if (rve) - *rve = s; - return s0; -} - -#endif // TQT_TQLOCALE_USES_FCVT diff --git a/tqtinterface/qt4/src/tools/tqlocale.h b/tqtinterface/qt4/src/tools/tqlocale.h deleted file mode 100644 index 362f317..0000000 --- a/tqtinterface/qt4/src/tools/tqlocale.h +++ /dev/null @@ -1,494 +0,0 @@ -/**************************************************************************** -** -** Declaration of the TQLocale class -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQLOCALE_H -#define TQLOCALE_H - -#include "tqstring.h" - -struct TQLocalePrivate; - -class TQ_EXPORT TQLocale -{ - friend class TQString; - -public: - enum Language { - C = 1, - Abkhazian = 2, - Afan = 3, - Afar = 4, - Afrikaans = 5, - Albanian = 6, - Amharic = 7, - Arabic = 8, - Armenian = 9, - Assamese = 10, - Aymara = 11, - Azerbaijani = 12, - Bashkir = 13, - Basque = 14, - Bengali = 15, - Bhutani = 16, - Bihari = 17, - Bislama = 18, - Breton = 19, - Bulgarian = 20, - Burmese = 21, - Byelorussian = 22, - Cambodian = 23, - Catalan = 24, - Chinese = 25, - Corsican = 26, - Croatian = 27, - Czech = 28, - Danish = 29, - Dutch = 30, - English = 31, - Esperanto = 32, - Estonian = 33, - Faroese = 34, - FijiLanguage = 35, - Finnish = 36, - French = 37, - Frisian = 38, - Gaelic = 39, - Galician = 40, - Georgian = 41, - German = 42, - Greek = 43, - Greenlandic = 44, - Guarani = 45, - Gujarati = 46, - Hausa = 47, - Hebrew = 48, - Hindi = 49, - Hungarian = 50, - Icelandic = 51, - Indonesian = 52, - Interlingua = 53, - Interlingue = 54, - Inuktitut = 55, - Inupiak = 56, - Irish = 57, - Italian = 58, - Japanese = 59, - Javanese = 60, - Kannada = 61, - Kashmiri = 62, - Kazakh = 63, - Kinyarwanda = 64, - Kirghiz = 65, - Korean = 66, - Kurdish = 67, - Kurundi = 68, - Laothian = 69, - Latin = 70, - Latvian = 71, - Lingala = 72, - Lithuanian = 73, - Macedonian = 74, - Malagasy = 75, - Malay = 76, - Malayalam = 77, - Maltese = 78, - Maori = 79, - Marathi = 80, - Moldavian = 81, - Mongolian = 82, - NauruLanguage = 83, - Nepali = 84, - Norwegian = 85, - Occitan = 86, - Oriya = 87, - Pashto = 88, - Persian = 89, - Polish = 90, - Portuguese = 91, - Punjabi = 92, - Quechua = 93, - RhaetoRomance = 94, - Romanian = 95, - Russian = 96, - Samoan = 97, - Sangho = 98, - Sanskrit = 99, - Serbian = 100, - SerboCroatian = 101, - Sesotho = 102, - Setswana = 103, - Shona = 104, - Sindhi = 105, - Singhalese = 106, - Siswati = 107, - Slovak = 108, - Slovenian = 109, - Somali = 110, - Spanish = 111, - Sundanese = 112, - Swahili = 113, - Swedish = 114, - Tagalog = 115, - Tajik = 116, - Tamil = 117, - Tatar = 118, - Telugu = 119, - Thai = 120, - Tibetan = 121, - Tigrinya = 122, - TongaLanguage = 123, - Tsonga = 124, - Turkish = 125, - Turkmen = 126, - Twi = 127, - Uigur = 128, - Ukrainian = 129, - Urdu = 130, - Uzbek = 131, - Vietnamese = 132, - Volapuk = 133, - Welsh = 134, - Wolof = 135, - Xhosa = 136, - Yiddish = 137, - Yoruba = 138, - Zhuang = 139, - Zulu = 140, - LastLanguage = Zulu - }; - - enum Country { - AnyCountry = 0, - Afghanistan = 1, - Albania = 2, - Algeria = 3, - AmericanSamoa = 4, - Andorra = 5, - Angola = 6, - Anguilla = 7, - Antarctica = 8, - AntiguaAndBarbuda = 9, - Argentina = 10, - Armenia = 11, - Aruba = 12, - Australia = 13, - Austria = 14, - Azerbaijan = 15, - Bahamas = 16, - Bahrain = 17, - Bangladesh = 18, - Barbados = 19, - Belarus = 20, - Belgium = 21, - Belize = 22, - Benin = 23, - Bermuda = 24, - Bhutan = 25, - Bolivia = 26, - BosniaAndHerzegowina = 27, - Botswana = 28, - BouvetIsland = 29, - Brazil = 30, - BritishIndianOceanTerritory = 31, - BruneiDarussalam = 32, - Bulgaria = 33, - BurkinaFaso = 34, - Burundi = 35, - Cambodia = 36, - Cameroon = 37, - Canada = 38, - CapeVerde = 39, - CaymanIslands = 40, - CentralAfricanRepublic = 41, - Chad = 42, - Chile = 43, - China = 44, - ChristmasIsland = 45, - CocosIslands = 46, - Colombia = 47, - Comoros = 48, - DetqmocraticRepublicOfCongo = 49, - PeoplesRepublicOfCongo = 50, - CookIslands = 51, - CostaRica = 52, - IvoryCoast = 53, - Croatia = 54, - Cuba = 55, - Cyprus = 56, - CzechRepublic = 57, - Denmark = 58, - Djibouti = 59, - Dominica = 60, - DominicanRepublic = 61, - EastTimor = 62, - Ecuador = 63, - Egypt = 64, - ElSalvador = 65, - EquatorialGuinea = 66, - Eritrea = 67, - Estonia = 68, - Ethiopia = 69, - FalklandIslands = 70, - FaroeIslands = 71, - FijiCountry = 72, - Finland = 73, - France = 74, - MetropolitanFrance = 75, - FrenchGuiana = 76, - FrenchPolynesia = 77, - FrenchSouthernTerritories = 78, - Gabon = 79, - Gambia = 80, - Georgia = 81, - Germany = 82, - Ghana = 83, - Gibraltar = 84, - Greece = 85, - Greenland = 86, - Grenada = 87, - Guadeloupe = 88, - Guam = 89, - Guatemala = 90, - Guinea = 91, - GuineaBissau = 92, - Guyana = 93, - Haiti = 94, - HeardAndMcDonaldIslands = 95, - Honduras = 96, - HongKong = 97, - Hungary = 98, - Iceland = 99, - India = 100, - Indonesia = 101, - Iran = 102, - Iraq = 103, - Ireland = 104, - Israel = 105, - Italy = 106, - Jamaica = 107, - Japan = 108, - Jordan = 109, - Kazakhstan = 110, - Kenya = 111, - Kiribati = 112, - DetqmocraticRepublicOfKorea = 113, - RepublicOfKorea = 114, - Kuwait = 115, - Kyrgyzstan = 116, - Lao = 117, - Latvia = 118, - Lebanon = 119, - Lesotho = 120, - Liberia = 121, - LibyanArabJamahiriya = 122, - Liechtenstein = 123, - Lithuania = 124, - Luxembourg = 125, - Macau = 126, - Macedonia = 127, - Madagascar = 128, - Malawi = 129, - Malaysia = 130, - Maldives = 131, - Mali = 132, - Malta = 133, - MarshallIslands = 134, - Martinique = 135, - Mauritania = 136, - Mauritius = 137, - Mayotte = 138, - Mexico = 139, - Micronesia = 140, - Moldova = 141, - Monaco = 142, - Mongolia = 143, - Montserrat = 144, - Morocco = 145, - Mozambique = 146, - Myanmar = 147, - Namibia = 148, - NauruCountry = 149, - Nepal = 150, - Netherlands = 151, - NetherlandsAntilles = 152, - NewCaledonia = 153, - NewZealand = 154, - Nicaragua = 155, - Niger = 156, - Nigeria = 157, - Niue = 158, - NorfolkIsland = 159, - NorthernMarianaIslands = 160, - Norway = 161, - Oman = 162, - Pakistan = 163, - Palau = 164, - PalestinianTerritory = 165, - Panama = 166, - PapuaNewGuinea = 167, - Paraguay = 168, - Peru = 169, - Philippines = 170, - Pitcairn = 171, - Poland = 172, - Portugal = 173, - PuertoRico = 174, - Qatar = 175, - Reunion = 176, - Romania = 177, - RussianFederation = 178, - Rwanda = 179, - SaintKittsAndNevis = 180, - StLucia = 181, - StVincentAndTheGrenadines = 182, - Samoa = 183, - SanMarino = 184, - SaoTomeAndPrincipe = 185, - SaudiArabia = 186, - Senegal = 187, - Seychelles = 188, - SierraLeone = 189, - Singapore = 190, - Slovakia = 191, - Slovenia = 192, - SolomonIslands = 193, - Somalia = 194, - SouthAfrica = 195, - SouthGeorgiaAndTheSouthSandwichIslands = 196, - Spain = 197, - SriLanka = 198, - StHelena = 199, - StPierreAndMiquelon = 200, - Sudan = 201, - Suriname = 202, - SvalbardAndJanMayenIslands = 203, - Swaziland = 204, - Sweden = 205, - Switzerland = 206, - SyrianArabRepublic = 207, - Taiwan = 208, - Tajikistan = 209, - Tanzania = 210, - Thailand = 211, - Togo = 212, - Tokelau = 213, - TongaCountry = 214, - TrinidadAndTobago = 215, - Tunisia = 216, - Turkey = 217, - Turkmenistan = 218, - TurksAndCaicosIslands = 219, - Tuvalu = 220, - Uganda = 221, - Ukraine = 222, - UnitedArabEmirates = 223, - UnitedKingdom = 224, - UnitedStates = 225, - UnitedStatesMinorOutlyingIslands = 226, - Uruguay = 227, - Uzbekistan = 228, - Vanuatu = 229, - VaticanCityState = 230, - Venezuela = 231, - VietNam = 232, - BritishVirginIslands = 233, - USVirginIslands = 234, - WallisAndFutunaIslands = 235, - WesternSahara = 236, - Yemen = 237, - Yugoslavia = 238, - Zambia = 239, - Zimbabwe = 240, - LastCountry = Zimbabwe - }; - - TQLocale(); - TQLocale(const TQString &name); - TQLocale(Language language, Country country = AnyCountry); - TQLocale(const TQLocale &other); - - TQLocale &operator=(const TQLocale &other); - - Language language() const; - Country country() const; - TQString name() const; - - short toShort(const TQString &s, bool *ok = 0) const; - ushort toUShort(const TQString &s, bool *ok = 0) const; - int toInt(const TQString &s, bool *ok = 0) const; - uint toUInt(const TQString &s, bool *ok = 0) const; - TQ_LONG toLong(const TQString &s, bool *ok = 0) const; - TQ_ULONG toULong(const TQString &s, bool *ok = 0) const; - TQ_LLONG toLongLong(const TQString &s, bool *ok = 0) const; - TQ_ULLONG toULongLong(const TQString &s, bool *ok = 0) const; - float toFloat(const TQString &s, bool *ok = 0) const; - double toDouble(const TQString &s, bool *ok = 0) const; - - TQString toString(short i) const - { return toString((TQ_LLONG)i); } - TQString toString(ushort i) const - { return toString((TQ_ULLONG)i); } - TQString toString(int i) const - { return toString((TQ_LLONG)i); } - TQString toString(uint i) const - { return toString((TQ_ULLONG)i); } -#if !defined(TQ_OS_WIN64) - TQString toString(TQ_LONG i) const - { return toString((TQ_LLONG)i); } - TQString toString(TQ_ULONG i) const - { return toString((TQ_ULLONG)i); } -#endif - TQString toString(TQ_LLONG i) const; - TQString toString(TQ_ULLONG i) const; - TQString toString(float i, char f = 'g', int prec = 6) const - { return toString((double) i, f, prec); } - TQString toString(double i, char f = 'g', int prec = 6) const; - - static TQString languageToString(Language language); - static TQString countryToString(Country country); - static void setDefault(const TQLocale &locale); - - static TQLocale c() { return TQLocale(C); } - static TQLocale system(); - -private: - const TQLocalePrivate *d; - static const TQLocalePrivate *default_d; -}; - -#endif diff --git a/tqtinterface/qt4/src/tools/tqlocale_p.h b/tqtinterface/qt4/src/tools/tqlocale_p.h deleted file mode 100644 index fbfc184..0000000 --- a/tqtinterface/qt4/src/tools/tqlocale_p.h +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** -** -** Declaration of the TQLocalePrivate class -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the widgets module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQLOCALE_P_H -#define TQLOCALE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of internal files. This header file may change from version to version -// without notice, or even be removed. -// -// We mean it. -// -// - -#include <tqstring.h> - -struct TQLocalePrivate -{ -public: - const TQChar &decimal() const { return (TQChar&)m_decimal; } - const TQChar &group() const { return (TQChar&)m_group; } - const TQChar &list() const { return (TQChar&)m_list; } - const TQChar &percent() const { return (TQChar&)m_percent; } - const TQChar &zero() const { return (TQChar&)m_zero; } - TQChar plus() const { return TQChar('+'); } - const TQChar &minus() const { return (TQChar&)m_minus; } - const TQChar &exponential() const { return (TQChar&)m_exponential; } - TQString infinity() const; - TQString nan() const; - - TQ_UINT32 languageId() const { return m_language_id; } - TQ_UINT32 countryId() const { return m_country_id; } - - bool isDigit(TQChar d) const; - - enum GroupSeparatorMode { - FailOnGroupSeparators, - ParseGroupSeparators - }; - - enum DoubleForm { - DFExponent = 0, // %e or %E - DFDecimal, // %f or %F - DFSignificantDigits, // %g or %G - _DFMax = DFSignificantDigits - }; - - enum Flags { - NoFlags = 0, - - // These correspond to the options in a printf format string - Alternate = 0x01, - ZeroPadded = 0x02, - LeftAdjusted = 0x04, - BlankBeforePositive = 0x08, - AlwaysShowSign = 0x10, - ThousandsGroup = 0x20, - CapitalEorX = 0x40 // %x, %e, %f, %g vs. %X, %E, %F, %G - }; - - TQString doubleToString(double d, - int precision = -1, - DoubleForm form = DFSignificantDigits, - int width = -1, - unsigned flags = NoFlags) const; - TQString longLongToString(TQ_LLONG l, int precision = -1, - int base = 10, - int width = -1, - unsigned flags = NoFlags) const; - TQString unsLongLongToString(TQ_ULLONG l, int precision = -1, - int base = 10, - int width = -1, - unsigned flags = NoFlags) const; - double stringToDouble(TQString num, bool *ok, GroupSeparatorMode group_sep_mode) const; - TQ_LLONG stringToLongLong(TQString num, int base, bool *ok, GroupSeparatorMode group_sep_mode) const; - TQ_ULLONG stringToUnsLongLong(TQString num, int base, bool *ok, GroupSeparatorMode group_sep_mode) const; - bool removeGroupSeparators(TQString &num_str) const; - bool numberToCLocale(TQString &locale_num, GroupSeparatorMode group_sep_mode) const; - - TQ_UINT32 m_language_id, m_country_id; - - TQ_UINT16 m_decimal, m_group, m_list, m_percent, - m_zero, m_minus, m_exponential; - - static const TQString m_infinity; - static const TQString m_nan; - static const TQChar m_plus; - - static const char *systemLocaleName(); -}; - -#endif diff --git a/tqtinterface/qt4/src/tools/tqmap.cpp b/tqtinterface/qt4/src/tools/tqmap.cpp deleted file mode 100644 index e581455..0000000 --- a/tqtinterface/qt4/src/tools/tqmap.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQMap -** -** Created : 990406 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqmap.h" - -typedef TQMapNodeBase* NodePtr; -typedef TQMapNodeBase Node; - - -void TQMapPrivateBase::rotateLeft( NodePtr x, NodePtr& root) -{ - NodePtr y = x->right; - x->right = y->left; - if (y->left !=0) - y->left->parent = x; - y->parent = x->parent; - if (x == root) - root = y; - else if (x == x->parent->left) - x->parent->left = y; - else - x->parent->right = y; - y->left = x; - x->parent = y; -} - - -void TQMapPrivateBase::rotateRight( NodePtr x, NodePtr& root ) -{ - NodePtr y = x->left; - x->left = y->right; - if (y->right != 0) - y->right->parent = x; - y->parent = x->parent; - if (x == root) - root = y; - else if (x == x->parent->right) - x->parent->right = y; - else - x->parent->left = y; - y->right = x; - x->parent = y; -} - - -void TQMapPrivateBase::rebalance( NodePtr x, NodePtr& root) -{ - x->color = Node::Red; - while ( x != root && x->parent->color == Node::Red ) { - if ( x->parent == x->parent->parent->left ) { - NodePtr y = x->parent->parent->right; - if (y && y->color == Node::Red) { - x->parent->color = Node::Black; - y->color = Node::Black; - x->parent->parent->color = Node::Red; - x = x->parent->parent; - } else { - if (x == x->parent->right) { - x = x->parent; - rotateLeft( x, root ); - } - x->parent->color = Node::Black; - x->parent->parent->color = Node::Red; - rotateRight (x->parent->parent, root ); - } - } else { - NodePtr y = x->parent->parent->left; - if ( y && y->color == Node::Red ) { - x->parent->color = Node::Black; - y->color = Node::Black; - x->parent->parent->color = Node::Red; - x = x->parent->parent; - } else { - if (x == x->parent->left) { - x = x->parent; - rotateRight( x, root ); - } - x->parent->color = Node::Black; - x->parent->parent->color = Node::Red; - rotateLeft( x->parent->parent, root ); - } - } - } - root->color = Node::Black; -} - - -NodePtr TQMapPrivateBase::removeAndRebalance( NodePtr z, NodePtr& root, - NodePtr& leftmost, - NodePtr& rightmost ) -{ - NodePtr y = z; - NodePtr x; - NodePtr x_parent; - if (y->left == 0) { - x = y->right; - } else { - if (y->right == 0) - x = y->left; - else - { - y = y->right; - while (y->left != 0) - y = y->left; - x = y->right; - } - } - if (y != z) { - z->left->parent = y; - y->left = z->left; - if (y != z->right) { - x_parent = y->parent; - if (x) - x->parent = y->parent; - y->parent->left = x; - y->right = z->right; - z->right->parent = y; - } else { - x_parent = y; - } - if (root == z) - root = y; - else if (z->parent->left == z) - z->parent->left = y; - else - z->parent->right = y; - y->parent = z->parent; - // Swap the colors - Node::Color c = y->color; - y->color = z->color; - z->color = c; - y = z; - } else { - x_parent = y->parent; - if (x) - x->parent = y->parent; - if (root == z) - root = x; - else if (z->parent->left == z) - z->parent->left = x; - else - z->parent->right = x; - if ( leftmost == z ) { - if (z->right == 0) - leftmost = z->parent; - else - leftmost = x->minimum(); - } - if (rightmost == z) { - if (z->left == 0) - rightmost = z->parent; - else - rightmost = x->maximum(); - } - } - if (y->color != Node::Red) { - while (x != root && (x == 0 || x->color == Node::Black)) { - if (x == x_parent->left) { - NodePtr w = x_parent->right; - if (w->color == Node::Red) { - w->color = Node::Black; - x_parent->color = Node::Red; - rotateLeft(x_parent, root); - w = x_parent->right; - } - if ((w->left == 0 || w->left->color == Node::Black) && - (w->right == 0 || w->right->color == Node::Black)) { - w->color = Node::Red; - x = x_parent; - x_parent = x_parent->parent; - } else { - if (w->right == 0 || w->right->color == Node::Black) { - if (w->left) - w->left->color = Node::Black; - w->color = Node::Red; - rotateRight(w, root); - w = x_parent->right; - } - w->color = x_parent->color; - x_parent->color = Node::Black; - if (w->right) - w->right->color = Node::Black; - rotateLeft(x_parent, root); - break; - } - } else { - NodePtr w = x_parent->left; - if (w->color == Node::Red) { - w->color = Node::Black; - x_parent->color = Node::Red; - rotateRight(x_parent, root); - w = x_parent->left; - } - if ((w->right == 0 || w->right->color == Node::Black) && - (w->left == 0 || w->left->color == Node::Black)) { - w->color = Node::Red; - x = x_parent; - x_parent = x_parent->parent; - } else { - if (w->left == 0 || w->left->color == Node::Black) { - if (w->right) - w->right->color = Node::Black; - w->color = Node::Red; - rotateLeft(w, root); - w = x_parent->left; - } - w->color = x_parent->color; - x_parent->color = Node::Black; - if (w->left) - w->left->color = Node::Black; - rotateRight(x_parent, root); - break; - } - } - } - if (x) - x->color = Node::Black; - } - return y; -} diff --git a/tqtinterface/qt4/src/tools/tqmap.h b/tqtinterface/qt4/src/tools/tqmap.h deleted file mode 100644 index cb280fc..0000000 --- a/tqtinterface/qt4/src/tools/tqmap.h +++ /dev/null @@ -1,937 +0,0 @@ -/**************************************************************************** -** -** Definition of TQMap class -** -** Created : 990406 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQMAP_H -#define TQMAP_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqglobal.h" -#include "tqshared.h" -#include "tqdatastream.h" -#include "tqpair.h" -#include "tqvaluelist.h" -#endif // TQT_H - -#ifdef USE_QT4 - -#include <Qt/qmap.h> - -#endif // USE_QT4 - -#ifndef TQT_NO_STL -#include <iterator> -#include <map> -#include <cstddef> -#endif - -//#define TQT_CHECK_MAP_RANGE - -struct TQ_EXPORT TQMapNodeBase -{ - enum Color { Red, Black }; - - TQMapNodeBase* left; - TQMapNodeBase* right; - TQMapNodeBase* parent; - - Color color; - - TQMapNodeBase* minimum() { - TQMapNodeBase* x = this; - while ( x->left ) - x = x->left; - return x; - } - - TQMapNodeBase* maximum() { - TQMapNodeBase* x = this; - while ( x->right ) - x = x->right; - return x; - } -}; - - -template <class K, class T> -struct TQMapNode : public TQMapNodeBase -{ - TQMapNode( const K& _key, const T& _data ) { data = _data; key = _key; } - TQMapNode( const K& _key ) { key = _key; } - TQMapNode( const TQMapNode<K,T>& _n ) { key = _n.key; data = _n.data; } - TQMapNode() { } - T data; - K key; -}; - - -template<class K, class T> -class TQMapIterator -{ - public: - /** - * Typedefs - */ - typedef TQMapNode< K, T >* NodePtr; -#ifndef TQT_NO_STL - typedef std::bidirectional_iterator_tag iterator_category; -#endif - typedef T value_type; -#ifndef TQT_NO_STL - typedef ptrdiff_t difference_type; -#else - typedef int difference_type; -#endif - typedef T* pointer; - typedef T& reference; - - /** - * Variables - */ - TQMapNode<K,T>* node; - - /** - * Functions - */ - TQMapIterator() : node( 0 ) {} - TQMapIterator( TQMapNode<K,T>* p ) : node( p ) {} - TQMapIterator( const TQMapIterator<K,T>& it ) : node( it.node ) {} - - bool operator==( const TQMapIterator<K,T>& it ) const { return node == it.node; } - bool operator!=( const TQMapIterator<K,T>& it ) const { return node != it.node; } - T& operator*() { return node->data; } - const T& operator*() const { return node->data; } - // UDT for T = x* - // T* operator->() const { return &node->data; } - - const K& key() const { return node->key; } - T& data() { return node->data; } - const T& data() const { return node->data; } - -private: - int inc(); - int dec(); - -public: - TQMapIterator<K,T>& operator++() { - inc(); - return *this; - } - - TQMapIterator<K,T> operator++(int) { - TQMapIterator<K,T> tmp = *this; - inc(); - return tmp; - } - - TQMapIterator<K,T>& operator--() { - dec(); - return *this; - } - - TQMapIterator<K,T> operator--(int) { - TQMapIterator<K,T> tmp = *this; - dec(); - return tmp; - } -}; - -template <class K, class T> -TQ_INLINE_TEMPLATES int TQMapIterator<K,T>::inc() -{ - TQMapNodeBase* tmp = node; - if ( tmp->right ) { - tmp = tmp->right; - while ( tmp->left ) - tmp = tmp->left; - } else { - TQMapNodeBase* y = tmp->parent; - while (tmp == y->right) { - tmp = y; - y = y->parent; - } - if (tmp->right != y) - tmp = y; - } - node = (NodePtr)tmp; - return 0; -} - -template <class K, class T> -TQ_INLINE_TEMPLATES int TQMapIterator<K,T>::dec() -{ - TQMapNodeBase* tmp = node; - if (tmp->color == TQMapNodeBase::Red && - tmp->parent->parent == tmp ) { - tmp = tmp->right; - } else if (tmp->left != 0) { - TQMapNodeBase* y = tmp->left; - while ( y->right ) - y = y->right; - tmp = y; - } else { - TQMapNodeBase* y = tmp->parent; - while (tmp == y->left) { - tmp = y; - y = y->parent; - } - tmp = y; - } - node = (NodePtr)tmp; - return 0; -} - -template<class K, class T> -class TQMapConstIterator -{ - public: - /** - * Typedefs - */ - typedef TQMapNode< K, T >* NodePtr; -#ifndef TQT_NO_STL - typedef std::bidirectional_iterator_tag iterator_category; -#endif - typedef T value_type; -#ifndef TQT_NO_STL - typedef ptrdiff_t difference_type; -#else - typedef int difference_type; -#endif - typedef const T* pointer; - typedef const T& reference; - - - /** - * Variables - */ - TQMapNode<K,T>* node; - - /** - * Functions - */ - TQMapConstIterator() : node( 0 ) {} - TQMapConstIterator( TQMapNode<K,T>* p ) : node( p ) {} - TQMapConstIterator( const TQMapConstIterator<K,T>& it ) : node( it.node ) {} - TQMapConstIterator( const TQMapIterator<K,T>& it ) : node( it.node ) {} - - bool operator==( const TQMapConstIterator<K,T>& it ) const { return node == it.node; } - bool operator!=( const TQMapConstIterator<K,T>& it ) const { return node != it.node; } - const T& operator*() const { return node->data; } - // UDT for T = x* - // const T* operator->() const { return &node->data; } - - const K& key() const { return node->key; } - const T& data() const { return node->data; } - -private: - int inc(); - int dec(); - -public: - TQMapConstIterator<K,T>& operator++() { - inc(); - return *this; - } - - TQMapConstIterator<K,T> operator++(int) { - TQMapConstIterator<K,T> tmp = *this; - inc(); - return tmp; - } - - TQMapConstIterator<K,T>& operator--() { - dec(); - return *this; - } - - TQMapConstIterator<K,T> operator--(int) { - TQMapConstIterator<K,T> tmp = *this; - dec(); - return tmp; - } -}; - -template <class K, class T> -TQ_INLINE_TEMPLATES int TQMapConstIterator<K,T>::inc() -{ - TQMapNodeBase* tmp = node; - if ( tmp->right ) { - tmp = tmp->right; - while ( tmp->left ) - tmp = tmp->left; - } else { - TQMapNodeBase* y = tmp->parent; - while (tmp == y->right) { - tmp = y; - y = y->parent; - } - if (tmp->right != y) - tmp = y; - } - node = (NodePtr)tmp; - return 0; -} - -template <class K, class T> -TQ_INLINE_TEMPLATES int TQMapConstIterator<K,T>::dec() -{ - TQMapNodeBase* tmp = node; - if (tmp->color == TQMapNodeBase::Red && - tmp->parent->parent == tmp ) { - tmp = tmp->right; - } else if (tmp->left != 0) { - TQMapNodeBase* y = tmp->left; - while ( y->right ) - y = y->right; - tmp = y; - } else { - TQMapNodeBase* y = tmp->parent; - while (tmp == y->left) { - tmp = y; - y = y->parent; - } - tmp = y; - } - node = (NodePtr)tmp; - return 0; -} - -// ### 4.0: rename to something without Private in it. Not really internal. -class TQ_EXPORT TQMapPrivateBase : public TQShared -{ -public: - TQMapPrivateBase() { - node_count = 0; - } - TQMapPrivateBase( const TQMapPrivateBase* _map) { - node_count = _map->node_count; - } - - /** - * Implementations of basic tree algorithms - */ - void rotateLeft( TQMapNodeBase* x, TQMapNodeBase*& root); - void rotateRight( TQMapNodeBase* x, TQMapNodeBase*& root ); - void rebalance( TQMapNodeBase* x, TQMapNodeBase*& root ); - TQMapNodeBase* removeAndRebalance( TQMapNodeBase* z, TQMapNodeBase*& root, - TQMapNodeBase*& leftmost, - TQMapNodeBase*& rightmost ); - - /** - * Variables - */ - int node_count; -}; - - -template <class Key, class T> -class TQMapPrivate : public TQMapPrivateBase -{ -public: - /** - * Typedefs - */ - typedef TQMapIterator< Key, T > Iterator; - typedef TQMapConstIterator< Key, T > ConstIterator; - typedef TQMapNode< Key, T > Node; - typedef TQMapNode< Key, T >* NodePtr; - - /** - * Functions - */ - TQMapPrivate(); - TQMapPrivate( const TQMapPrivate< Key, T >* _map ); - ~TQMapPrivate() { clear(); delete header; } - - NodePtr copy( NodePtr p ); - void clear(); - void clear( NodePtr p ); - - Iterator begin() { return Iterator( (NodePtr)(header->left ) ); } - Iterator end() { return Iterator( header ); } - ConstIterator begin() const { return ConstIterator( (NodePtr)(header->left ) ); } - ConstIterator end() const { return ConstIterator( header ); } - - ConstIterator find(const Key& k) const; - - void remove( Iterator it ) { - NodePtr del = (NodePtr) removeAndRebalance( it.node, header->parent, header->left, header->right ); - delete del; - --node_count; - } - -#ifdef TQT_TQMAP_DEBUG - void inorder( TQMapNodeBase* x = 0, int level = 0 ){ - if ( !x ) - x = header->parent; - if ( x->left ) - inorder( x->left, level + 1 ); - //cout << level << " Key=" << key(x) << " Value=" << ((NodePtr)x)->data << endl; - if ( x->right ) - inorder( x->right, level + 1 ); - } -#endif - -#if 0 - Iterator insertMulti(const Key& v){ - TQMapNodeBase* y = header; - TQMapNodeBase* x = header->parent; - while (x != 0){ - y = x; - x = ( v < key(x) ) ? x->left : x->right; - } - return insert(x, y, v); - } -#endif - - Iterator insertSingle( const Key& k ); - Iterator insert( TQMapNodeBase* x, TQMapNodeBase* y, const Key& k ); - -protected: - /** - * Helpers - */ - const Key& key( TQMapNodeBase* b ) const { return ((NodePtr)b)->key; } - - /** - * Variables - */ - NodePtr header; -}; - - -template <class Key, class T> -TQ_INLINE_TEMPLATES TQMapPrivate<Key,T>::TQMapPrivate() { - header = new Node; - header->color = TQMapNodeBase::Red; // Mark the header - header->parent = 0; - header->left = header->right = header; -} -template <class Key, class T> -TQ_INLINE_TEMPLATES TQMapPrivate<Key,T>::TQMapPrivate( const TQMapPrivate< Key, T >* _map ) : TQMapPrivateBase( _map ) { - header = new Node; - header->color = TQMapNodeBase::Red; // Mark the header - if ( _map->header->parent == 0 ) { - header->parent = 0; - header->left = header->right = header; - } else { - header->parent = copy( (NodePtr)(_map->header->parent) ); - header->parent->parent = header; - header->left = header->parent->minimum(); - header->right = header->parent->maximum(); - } -} - -template <class Key, class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQMapPrivate<Key,T>::NodePtr TQMapPrivate<Key,T>::copy( TQ_TYPENAME TQMapPrivate<Key,T>::NodePtr p ) -{ - if ( !p ) - return 0; - NodePtr n = new Node( *p ); - n->color = p->color; - if ( p->left ) { - n->left = copy( (NodePtr)(p->left) ); - n->left->parent = n; - } else { - n->left = 0; - } - if ( p->right ) { - n->right = copy( (NodePtr)(p->right) ); - n->right->parent = n; - } else { - n->right = 0; - } - return n; -} - -template <class Key, class T> -TQ_INLINE_TEMPLATES void TQMapPrivate<Key,T>::clear() -{ - clear( (NodePtr)(header->parent) ); - header->color = TQMapNodeBase::Red; - header->parent = 0; - header->left = header->right = header; - node_count = 0; -} - -template <class Key, class T> -TQ_INLINE_TEMPLATES void TQMapPrivate<Key,T>::clear( TQ_TYPENAME TQMapPrivate<Key,T>::NodePtr p ) -{ - while ( p != 0 ) { - clear( (NodePtr)p->right ); - NodePtr y = (NodePtr)p->left; - delete p; - p = y; - } -} - -template <class Key, class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQMapPrivate<Key,T>::ConstIterator TQMapPrivate<Key,T>::find(const Key& k) const -{ - TQMapNodeBase* y = header; // Last node - TQMapNodeBase* x = header->parent; // Root node. - - while ( x != 0 ) { - // If as k <= key(x) go left - if ( !( key(x) < k ) ) { - y = x; - x = x->left; - } else { - x = x->right; - } - } - - // Was k bigger/smaller then the biggest/smallest - // element of the tree ? Return end() - if ( y == header || k < key(y) ) - return ConstIterator( header ); - return ConstIterator( (NodePtr)y ); -} - -template <class Key, class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQMapPrivate<Key,T>::Iterator TQMapPrivate<Key,T>::insertSingle( const Key& k ) -{ - // Search correct position in the tree - TQMapNodeBase* y = header; - TQMapNodeBase* x = header->parent; - bool result = TRUE; - while ( x != 0 ) { - result = ( k < key(x) ); - y = x; - x = result ? x->left : x->right; - } - // Get iterator on the last not empty one - Iterator j( (NodePtr)y ); - if ( result ) { - // Smaller then the leftmost one ? - if ( j == begin() ) { - return insert(x, y, k ); - } else { - // Perhaps daddy is the right one ? - --j; - } - } - // Really bigger ? - if ( (j.node->key) < k ) - return insert(x, y, k ); - // We are going to replace a node - return j; -} - - -template <class Key, class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQMapPrivate<Key,T>::Iterator TQMapPrivate<Key,T>::insert( TQMapNodeBase* x, TQMapNodeBase* y, const Key& k ) -{ - NodePtr z = new Node( k ); - if (y == header || x != 0 || k < key(y) ) { - y->left = z; // also makes leftmost = z when y == header - if ( y == header ) { - header->parent = z; - header->right = z; - } else if ( y == header->left ) - header->left = z; // maintain leftmost pointing to min node - } else { - y->right = z; - if ( y == header->right ) - header->right = z; // maintain rightmost pointing to max node - } - z->parent = y; - z->left = 0; - z->right = 0; - rebalance( z, header->parent ); - ++node_count; - return Iterator(z); -} - - -#ifdef TQT_CHECK_RANGE -# if !defined( TQT_NO_DEBUG ) && defined( TQT_CHECK_MAP_RANGE ) -# define TQT_CHECK_INVALID_MAP_ELEMENT if ( empty() ) qWarning( "TQMap: Warning invalid element" ) -# define TQT_CHECK_INVALID_MAP_ELEMENT_FATAL TQ_ASSERT( !empty() ); -# else -# define TQT_CHECK_INVALID_MAP_ELEMENT -# define TQT_CHECK_INVALID_MAP_ELEMENT_FATAL -# endif -#else -# define TQT_CHECK_INVALID_MAP_ELEMENT -# define TQT_CHECK_INVALID_MAP_ELEMENT_FATAL -#endif - -template <class T> class TQDeepCopy; - -template<class Key, class T> -class TQMap -{ -public: - /** - * Typedefs - */ - typedef Key key_type; - typedef T mapped_type; - typedef TQPair<const key_type, mapped_type> value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef value_type& reference; - typedef const value_type& const_reference; -#ifndef TQT_NO_STL - typedef ptrdiff_t difference_type; -#else - typedef int difference_type; -#endif - typedef size_t size_type; - typedef TQMapIterator<Key,T> iterator; - typedef TQMapConstIterator<Key,T> const_iterator; - typedef TQPair<iterator,bool> insert_pair; - - typedef TQMapIterator< Key, T > Iterator; - typedef TQMapConstIterator< Key, T > ConstIterator; - typedef T ValueType; - typedef TQMapPrivate< Key, T > Priv; - - /** - * API - */ - TQMap() - { - sh = new TQMapPrivate< Key, T >; - } - TQMap( const TQMap<Key,T>& m ) - { - sh = m.sh; sh->ref(); - } - -#ifndef TQT_NO_STL - TQMap( const std::map<Key,T>& m ) - { - sh = new TQMapPrivate<Key,T>; - TQ_TYPENAME std::map<Key,T>::const_iterator it = m.begin(); - for ( ; it != m.end(); ++it ) { - value_type p( (*it).first, (*it).second ); - insert( p ); - } - } -#endif - ~TQMap() - { - if ( sh->deref() ) - delete sh; - } - TQMap<Key,T>& operator= ( const TQMap<Key,T>& m ); -#ifndef TQT_NO_STL - TQMap<Key,T>& operator= ( const std::map<Key,T>& m ) - { - clear(); - TQ_TYPENAME std::map<Key,T>::const_iterator it = m.begin(); - for ( ; it != m.end(); ++it ) { - value_type p( (*it).first, (*it).second ); - insert( p ); - } - return *this; - } -#endif - -#ifdef USE_QT4 - // Interoperability - TQMap(const QMap<Key,T>& m) - { - QMapIterator<Key,T> i(m); - while (i.hasNext()) { - i.next(); - insert(i.key(), i.value()); - } - } - TQMap<Key,T>& operator= (const QMap<Key,T>& m) - { - this->clear(); - QMapIterator<Key,T> i(m); - while (i.hasNext()) { - i.next(); - insert(i.key(), i.value()); - } - return *this; - } - - // FIXME BROKEN! - operator QMap<Key,T>(); - operator QMap<Key,T>() const; -#endif // USE_QT4 - - iterator begin() { detach(); return sh->begin(); } - iterator end() { detach(); return sh->end(); } - const_iterator begin() const { return ((const Priv*)sh)->begin(); } - const_iterator end() const { return ((const Priv*)sh)->end(); } - const_iterator constBegin() const { return begin(); } - const_iterator constEnd() const { return end(); } - - iterator replace( const Key& k, const T& v ) - { - remove( k ); - return insert( k, v ); - } - - size_type size() const - { - return sh->node_count; - } - bool empty() const - { - return sh->node_count == 0; - } - TQPair<iterator,bool> insert( const value_type& x ); - - void erase( iterator it ) - { - detach(); - sh->remove( it ); - } - void erase( const key_type& k ); - size_type count( const key_type& k ) const; - T& operator[] ( const Key& k ); - void clear(); - - iterator find ( const Key& k ) - { - detach(); - return iterator( sh->find( k ).node ); - } - const_iterator find ( const Key& k ) const { return sh->find( k ); } - - const T& operator[] ( const Key& k ) const - { TQT_CHECK_INVALID_MAP_ELEMENT; return sh->find( k ).data(); } - bool contains ( const Key& k ) const - { return find( k ) != end(); } - //{ return sh->find( k ) != ((const Priv*)sh)->end(); } - - size_type count() const { return sh->node_count; } - - TQValueList<Key> keys() const { - TQValueList<Key> r; - for (const_iterator i=begin(); i!=end(); ++i) - r.append(i.key()); - return r; - } - - TQValueList<T> values() const { - TQValueList<T> r; - for (const_iterator i=begin(); i!=end(); ++i) - r.append(*i); - return r; - } - - bool isEmpty() const { return sh->node_count == 0; } - - iterator insert( const Key& key, const T& value, bool overwrite = TRUE ); - void remove( iterator it ) { detach(); sh->remove( it ); } - void remove( const Key& k ); - -#if defined(TQ_FULL_TEMPLATE_INSTANTIATION) - bool operator==( const TQMap<Key,T>& ) const { return FALSE; } -#ifndef TQT_NO_STL - bool operator==( const std::map<Key,T>& ) const { return FALSE; } -#endif -#endif - -protected: - /** - * Helpers - */ - void detach() { if ( sh->count > 1 ) detachInternal(); } - - Priv* sh; -private: - void detachInternal(); - - friend class TQDeepCopy< TQMap<Key,T> >; -}; - -#ifdef USE_QT4 - -// Interoperability -template<class Key, class T> -TQMap<Key,T>::operator QMap<Key,T>() { - QMap<Key,T> map; - iterator it; - for ( it = this->begin(); it != this->end(); ++it) { - map.insert(it.key(), it.data()); - } - return map; -} - -// Interoperability -template<class Key, class T> -TQMap<Key,T>::operator QMap<Key,T>() const { - QMap<Key,T> map; - const_iterator it; - for ( it = this->begin(); it != this->end(); ++it) { - map.insert(it.key(), it.data()); - } - return map; -} - -#endif // USE_QT4 - -template<class Key, class T> -TQ_INLINE_TEMPLATES TQMap<Key,T>& TQMap<Key,T>::operator= ( const TQMap<Key,T>& m ) -{ - m.sh->ref(); - if ( sh->deref() ) - delete sh; - sh = m.sh; - return *this; -} - -template<class Key, class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQMap<Key,T>::insert_pair TQMap<Key,T>::insert( const TQ_TYPENAME TQMap<Key,T>::value_type& x ) -{ - detach(); - size_type n = size(); - iterator it = sh->insertSingle( x.first ); - bool inserted = FALSE; - if ( n < size() ) { - inserted = TRUE; - it.data() = x.second; - } - return TQPair<iterator,bool>( it, inserted ); -} - -template<class Key, class T> -TQ_INLINE_TEMPLATES void TQMap<Key,T>::erase( const Key& k ) -{ - detach(); - iterator it( sh->find( k ).node ); - if ( it != end() ) - sh->remove( it ); -} - -template<class Key, class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQMap<Key,T>::size_type TQMap<Key,T>::count( const Key& k ) const -{ - const_iterator it( sh->find( k ).node ); - if ( it != end() ) { - size_type c = 0; - while ( it != end() ) { - ++it; - ++c; - } - return c; - } - return 0; -} - -template<class Key, class T> -TQ_INLINE_TEMPLATES T& TQMap<Key,T>::operator[] ( const Key& k ) -{ - detach(); - TQMapNode<Key,T>* p = sh->find( k ).node; - if ( p != sh->end().node ) - return p->data; - return insert( k, T() ).data(); -} - -template<class Key, class T> -TQ_INLINE_TEMPLATES void TQMap<Key,T>::clear() -{ - if ( sh->count == 1 ) - sh->clear(); - else { - sh->deref(); - sh = new TQMapPrivate<Key,T>; - } -} - -template<class Key, class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQMap<Key,T>::iterator TQMap<Key,T>::insert( const Key& key, const T& value, bool overwrite ) -{ - detach(); - size_type n = size(); - iterator it = sh->insertSingle( key ); - if ( overwrite || n < size() ) - it.data() = value; - return it; -} - -template<class Key, class T> -TQ_INLINE_TEMPLATES void TQMap<Key,T>::remove( const Key& k ) -{ - detach(); - iterator it( sh->find( k ).node ); - if ( it != end() ) - sh->remove( it ); -} - -template<class Key, class T> -TQ_INLINE_TEMPLATES void TQMap<Key,T>::detachInternal() -{ - sh->deref(); sh = new TQMapPrivate<Key,T>( sh ); -} - - -#ifndef TQT_NO_DATASTREAM -template<class Key, class T> -TQ_INLINE_TEMPLATES TQDataStream& operator>>( TQDataStream& s, TQMap<Key,T>& m ) { - m.clear(); - TQ_UINT32 c; - s >> c; - for( TQ_UINT32 i = 0; i < c; ++i ) { - Key k; T t; - s >> k >> t; - m.insert( k, t ); - if ( s.atEnd() ) - break; - } - return s; -} - - -template<class Key, class T> -TQ_INLINE_TEMPLATES TQDataStream& operator<<( TQDataStream& s, const TQMap<Key,T>& m ) { - s << (TQ_UINT32)m.size(); - TQMapConstIterator<Key,T> it = m.begin(); - for( ; it != m.end(); ++it ) - s << it.key() << it.data(); - return s; -} -#endif - -#define TQ_DEFINED_TQMAP -#include "tqwinexport.h" -#endif // TQMAP_H diff --git a/tqtinterface/qt4/src/tools/tqmemarray.h b/tqtinterface/qt4/src/tools/tqmemarray.h deleted file mode 100644 index df76c98..0000000 --- a/tqtinterface/qt4/src/tools/tqmemarray.h +++ /dev/null @@ -1,123 +0,0 @@ -/**************************************************************************** -** -** Definition of TQMemArray template/macro class -** -** Created : 930906 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQMEMARRAY_H -#define TQMEMARRAY_H - -#ifndef TQT_H -#include "tqgarray.h" -#endif // TQT_H - - -template<class type> -class TQMemArray : public TQGArray -{ -public: - typedef type* Iterator; - typedef const type* ConstIterator; - typedef type ValueType; - -protected: - TQMemArray( int, int ) : TQGArray( 0, 0 ) {} - -public: - TQMemArray() {} - TQMemArray( int size ) : TQGArray(size*sizeof(type)) {} // ### 4.0 TQ_EXPLICIT - TQMemArray( const TQMemArray<type> &a ) : TQGArray(a) {} - ~TQMemArray() {} - TQMemArray<type> &operator=(const TQMemArray<type> &a) - { return (TQMemArray<type>&)TQGArray::assign(a); } - type *data() const { return (type *)TQGArray::data(); } - uint nrefs() const { return TQGArray::nrefs(); } - uint size() const { return TQGArray::size()/sizeof(type); } - uint count() const { return size(); } - bool isEmpty() const { return TQGArray::size() == 0; } - bool isNull() const { return TQGArray::data() == 0; } - bool resize( uint size ) { return TQGArray::resize(size*sizeof(type)); } - bool resize( uint size, Optimization optim ) { return TQGArray::resize(size*sizeof(type), optim); } - bool truncate( uint pos ) { return TQGArray::resize(pos*sizeof(type)); } - bool fill( const type &d, int size = -1 ) - { return TQGArray::fill((char*)&d,size,sizeof(type) ); } - void detach() { TQGArray::detach(); } - TQMemArray<type> copy() const - { TQMemArray<type> tmp; return tmp.duplicate(*this); } - TQMemArray<type>& assign( const TQMemArray<type>& a ) - { return (TQMemArray<type>&)TQGArray::assign(a); } - TQMemArray<type>& assign( const type *a, uint n ) - { return (TQMemArray<type>&)TQGArray::assign((char*)a,n*sizeof(type)); } - TQMemArray<type>& duplicate( const TQMemArray<type>& a ) - { return (TQMemArray<type>&)TQGArray::duplicate(a); } - TQMemArray<type>& duplicate( const type *a, uint n ) - { return (TQMemArray<type>&)TQGArray::duplicate((char*)a,n*sizeof(type)); } - TQMemArray<type>& setRawData( const type *a, uint n ) - { return (TQMemArray<type>&)TQGArray::setRawData((char*)a, - n*sizeof(type)); } - void resetRawData( const type *a, uint n ) - { TQGArray::resetRawData((char*)a,n*sizeof(type)); } - int find( const type &d, uint i=0 ) const - { return TQGArray::find((char*)&d,i,sizeof(type)); } - int contains( const type &d ) const - { return TQGArray::contains((char*)&d,sizeof(type)); } - void sort() { TQGArray::sort(sizeof(type)); } - int bsearch( const type &d ) const - { return TQGArray::bsearch((const char*)&d,sizeof(type)); } - // ### TQt 4.0: maybe provide uint overload as work-around for MSVC bug - type& operator[]( int i ) const - { return (type &)(*(type *)TQGArray::at(i*sizeof(type))); } - type& at( uint i ) const - { return (type &)(*(type *)TQGArray::at(i*sizeof(type))); } - type& tqat( uint i ) const - { return (type &)(*(type *)TQGArray::at(i*sizeof(type))); } - operator const type*() const { return (const type *)TQGArray::data(); } - bool operator==( const TQMemArray<type> &a ) const { return isEqual(a); } - bool operator!=( const TQMemArray<type> &a ) const { return !isEqual(a); } - Iterator begin() { return data(); } - Iterator end() { return data() + size(); } - ConstIterator begin() const { return data(); } - ConstIterator end() const { return data() + size(); } -}; - -#ifndef TQT_NO_COMPAT -#define TQArray TQMemArray -#endif - -#define TQ_DEFINED_TQMEMARRAY -#include "tqwinexport.h" -#endif // TQARRAY_H diff --git a/tqtinterface/qt4/src/tools/tqmutex.h b/tqtinterface/qt4/src/tools/tqmutex.h deleted file mode 100644 index 2d0d8b3..0000000 --- a/tqtinterface/qt4/src/tools/tqmutex.h +++ /dev/null @@ -1,114 +0,0 @@ -/**************************************************************************** -** -** Definition of TQMutex class -** -** Created : 931107 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQMUTEX_H -#define TQMUTEX_H - -#ifndef TQT_H -#include "tqglobal.h" -#endif // TQT_H - -#if defined(TQT_THREAD_SUPPORT) - -class TQMutexPrivate; - -const int TQ_MUTEX_NORMAL = 0; -const int TQ_MUTEX_RECURSIVE = 1; - -class TQ_EXPORT TQMutex -{ - friend class TQThread; - friend class TQWaitCondition; - friend class TQWaitConditionPrivate; - -public: - TQMutex(bool recursive = FALSE); - virtual ~TQMutex(); - - void lock(); - void unlock(); - bool locked(); - bool tryLock(); - -private: - TQMutexPrivate * d; - -#if defined(TQ_DISABLE_COPY) - TQMutex( const TQMutex & ); - TQMutex &operator=( const TQMutex & ); -#endif -}; - -class TQ_EXPORT TQMutexLocker -{ -public: - TQMutexLocker( TQMutex * ); - ~TQMutexLocker(); - - TQMutex *mutex() const; - -private: - TQMutex *mtx; - -#if defined(TQ_DISABLE_COPY) - TQMutexLocker( const TQMutexLocker & ); - TQMutexLocker &operator=( const TQMutexLocker & ); -#endif -}; - -inline TQMutexLocker::TQMutexLocker( TQMutex *m ) - : mtx( m ) -{ - if ( mtx ) mtx->lock(); -} - -inline TQMutexLocker::~TQMutexLocker() -{ - if ( mtx ) mtx->unlock(); -} - -inline TQMutex *TQMutexLocker::mutex() const -{ - return mtx; -} - -#endif - -#endif diff --git a/tqtinterface/qt4/src/tools/tqmutex_p.h b/tqtinterface/qt4/src/tools/tqmutex_p.h deleted file mode 100644 index 0397d3e..0000000 --- a/tqtinterface/qt4/src/tools/tqmutex_p.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** TQMutex private class declarations -** -** Created : 20012507 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQMUTEX_P_H -#define TQMUTEX_P_H - -#ifndef TQT_H -#endif // TQT_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of qmutex_unix.cpp and qmutex_win.cpp. This header file may change -// from version to version without notice, or even be removed. -// -// We mean it. -// - -class TQMutexPrivate { -public: - // TQ_MUTEX_T is defined in the various *.cpp files - TQ_MUTEX_T handle; - - virtual ~TQMutexPrivate(); - - virtual void lock() = 0; - virtual void unlock() = 0; - virtual bool locked() = 0; - virtual bool trylock() = 0; - virtual int type() const = 0; -}; - - -#endif // TQMUTEX_P_H diff --git a/tqtinterface/qt4/src/tools/tqmutex_unix.cpp b/tqtinterface/qt4/src/tools/tqmutex_unix.cpp deleted file mode 100644 index 540a128..0000000 --- a/tqtinterface/qt4/src/tools/tqmutex_unix.cpp +++ /dev/null @@ -1,695 +0,0 @@ -/**************************************************************************** -** -** TQMutex class for Unix -** -** Created : 20010725 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#if defined(TQT_THREAD_SUPPORT) - -#include "tqplatformdefs.h" - -typedef pthread_mutex_t TQ_MUTEX_T; - -// POSIX threads mutex types -#if ((defined(PTHREAD_MUTEX_RECURSIVE) && defined(PTHREAD_MUTEX_DEFAULT)) || \ - defined(TQ_OS_FREEBSD)) && !defined(TQ_OS_UNIXWARE) && !defined(TQ_OS_SOLARIS) && \ - !defined(TQ_OS_MAC) -// POSIX 1003.1c-1995 - We love this OS -# define TQ_MUTEX_SET_TYPE(a, b) pthread_mutexattr_settype((a), (b)) -# if defined(TQT_CHECK_RANGE) -# define TQ_NORMAL_MUTEX_TYPE PTHREAD_MUTEX_ERRORCHECK -# else -# define TQ_NORMAL_MUTEX_TYPE PTHREAD_MUTEX_DEFAULT -# endif -# define TQ_RECURSIVE_MUTEX_TYPE PTHREAD_MUTEX_RECURSIVE -#elif defined(MUTEX_NONRECURSIVE_NP) && defined(MUTEX_RECURSIVE_NP) -// POSIX 1003.4a pthreads draft extensions -# define TQ_MUTEX_SET_TYPE(a, b) pthread_mutexattr_setkind_np((a), (b)); -# define TQ_NORMAL_MUTEX_TYPE MUTEX_NONRECURSIVE_NP -# define TQ_RECURSIVE_MUTEX_TYPE MUTEX_RECURSIVE_NP -#else -// Unknown mutex types - skip them -# define TQ_MUTEX_SET_TYPE(a, b) -# undef TQ_NORMAL_MUTEX_TYPE -# undef TQ_RECURSIVE_MUTEX_TYPE -#endif - -#include "tqmutex.h" -#include "tqmutex_p.h" - -#include <errno.h> -#include <string.h> - - -// Private class declarations - -class TQRealMutexPrivate : public TQMutexPrivate { -public: - TQRealMutexPrivate(bool = FALSE); - - void lock(); - void unlock(); - bool locked(); - bool trylock(); - int type() const; - - bool recursive; -}; - -#ifndef TQ_RECURSIVE_MUTEX_TYPE -class TQRecursiveMutexPrivate : public TQMutexPrivate -{ -public: - TQRecursiveMutexPrivate(); - ~TQRecursiveMutexPrivate(); - - void lock(); - void unlock(); - bool locked(); - bool trylock(); - int type() const; - - int count; - unsigned long owner; - pthread_mutex_t handle2; -}; -#endif // !TQ_RECURSIVE_MUTEX_TYPE - - -// Private class implementation - -// base destructor -TQMutexPrivate::~TQMutexPrivate() -{ - int ret = pthread_mutex_destroy(&handle); - -#ifdef TQT_CHECK_RANGE - if ( ret ) - qWarning( "Mutex destroy failure: %s", strerror( ret ) ); -#endif -} - -// real mutex class -TQRealMutexPrivate::TQRealMutexPrivate(bool recurs) - : recursive(recurs) -{ - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - TQ_MUTEX_SET_TYPE(&attr, recursive ? TQ_RECURSIVE_MUTEX_TYPE : TQ_NORMAL_MUTEX_TYPE); - TQ_UNUSED(recursive); - int ret = pthread_mutex_init(&handle, &attr); - pthread_mutexattr_destroy(&attr); - -#ifdef TQT_CHECK_RANGE - if( ret ) - qWarning( "Mutex init failure: %s", strerror( ret ) ); -#endif // TQT_CHECK_RANGE -} - -void TQRealMutexPrivate::lock() -{ - int ret = pthread_mutex_lock(&handle); - -#ifdef TQT_CHECK_RANGE - if (ret) - qWarning("Mutex lock failure: %s", strerror(ret)); -#endif -} - -void TQRealMutexPrivate::unlock() -{ - int ret = pthread_mutex_unlock(&handle); - -#ifdef TQT_CHECK_RANGE - if (ret) - qWarning("Mutex unlock failure: %s", strerror(ret)); -#endif -} - -bool TQRealMutexPrivate::locked() -{ - int ret = pthread_mutex_trylock(&handle); - - if (ret == EBUSY) { - return TRUE; - } else if (ret) { -#ifdef TQT_CHECK_RANGE - qWarning("Mutex locktest failure: %s", strerror(ret)); -#endif - } else - pthread_mutex_unlock(&handle); - - return FALSE; -} - -bool TQRealMutexPrivate::trylock() -{ - int ret = pthread_mutex_trylock(&handle); - - if (ret == EBUSY) { - return FALSE; - } else if (ret) { -#ifdef TQT_CHECK_RANGE - qWarning("Mutex trylock failure: %s", strerror(ret)); -#endif - return FALSE; - } - - return TRUE; -} - -int TQRealMutexPrivate::type() const -{ - return recursive ? TQ_MUTEX_RECURSIVE : TQ_MUTEX_NORMAL; -} - - -#ifndef TQ_RECURSIVE_MUTEX_TYPE -TQRecursiveMutexPrivate::TQRecursiveMutexPrivate() - : count(0), owner(0) -{ - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - TQ_MUTEX_SET_TYPE(&attr, TQ_NORMAL_MUTEX_TYPE); - int ret = pthread_mutex_init(&handle, &attr); - pthread_mutexattr_destroy(&attr); - -# ifdef TQT_CHECK_RANGE - if (ret) - qWarning( "Mutex init failure: %s", strerror(ret) ); -# endif - - pthread_mutexattr_init(&attr); - ret = pthread_mutex_init( &handle2, &attr ); - pthread_mutexattr_destroy(&attr); - -# ifdef TQT_CHECK_RANGE - if (ret) - qWarning( "Mutex init failure: %s", strerror(ret) ); -# endif -} - -TQRecursiveMutexPrivate::~TQRecursiveMutexPrivate() -{ - int ret = pthread_mutex_destroy(&handle2); - -# ifdef TQT_CHECK_RANGE - if (ret) - qWarning( "Mutex destroy failure: %s", strerror(ret) ); -# endif -} - -void TQRecursiveMutexPrivate::lock() -{ - pthread_mutex_lock(&handle2); - - if (count > 0 && owner == (unsigned long) pthread_self()) { - count++; - } else { - pthread_mutex_unlock(&handle2); - pthread_mutex_lock(&handle); - pthread_mutex_lock(&handle2); - count = 1; - owner = (unsigned long) pthread_self(); - } - - pthread_mutex_unlock(&handle2); -} - -void TQRecursiveMutexPrivate::unlock() -{ - pthread_mutex_lock(&handle2); - - if (owner == (unsigned long) pthread_self()) { - // do nothing if the count is already 0... to reflect the behaviour described - // in the docs - if (count && (--count) < 1) { - count = 0; - pthread_mutex_unlock(&handle); - } - } else { -#ifdef TQT_CHECK_RANGE - qWarning("TQMutex::unlock: unlock from different thread than locker"); - qWarning(" was locked by %d, unlock attempt from %d", - (int)owner, (int)pthread_self()); -#endif - } - - pthread_mutex_unlock(&handle2); -} - -bool TQRecursiveMutexPrivate::locked() -{ - pthread_mutex_lock(&handle2); - - bool ret; - int code = pthread_mutex_trylock(&handle); - - if (code == EBUSY) { - ret = TRUE; - } else { -#ifdef TQT_CHECK_RANGE - if (code) - qWarning("Mutex trylock failure: %s", strerror(code)); -#endif - - pthread_mutex_unlock(&handle); - ret = FALSE; - } - - pthread_mutex_unlock(&handle2); - - return ret; -} - -bool TQRecursiveMutexPrivate::trylock() -{ - bool ret = TRUE; - - pthread_mutex_lock(&handle2); - - if ( count > 0 && owner == (unsigned long) pthread_self() ) { - count++; - } else { - int code = pthread_mutex_trylock(&handle); - - if (code == EBUSY) { - ret = FALSE; - } else if (code) { -#ifdef TQT_CHECK_RANGE - qWarning("Mutex trylock failure: %s", strerror(code)); -#endif - ret = FALSE; - } else { - count = 1; - owner = (unsigned long) pthread_self(); - } - } - - pthread_mutex_unlock(&handle2); - - return ret; -} - -int TQRecursiveMutexPrivate::type() const -{ - return TQ_MUTEX_RECURSIVE; -} - -#endif // !TQ_RECURSIVE_MUTEX_TYPE - - -/*! - \class TQMutex tqmutex.h - \threadsafe - \brief The TQMutex class provides access serialization between threads. - - \ingroup thread - \ingroup environment - - The purpose of a TQMutex is to protect an object, data structure or - section of code so that only one thread can access it at a time - (This is similar to the Java \c synchronized keyword). For - example, say there is a method which prints a message to the user - on two lines: - - \code - int number = 6; - - void method1() - { - number *= 5; - number /= 4; - } - - void method2() - { - number *= 3; - number /= 2; - } - \endcode - - If these two methods are called in succession, the following happens: - - \code - // method1() - number *= 5; // number is now 30 - number /= 4; // number is now 7 - - // method2() - number *= 3; // nubmer is now 21 - number /= 2; // number is now 10 - \endcode - - If these two methods are called simultaneously from two threads then the - following sequence could result: - - \code - // Thread 1 calls method1() - number *= 5; // number is now 30 - - // Thread 2 calls method2(). - // - // Most likely Thread 1 has been put to sleep by the operating - // system to allow Thread 2 to run. - number *= 3; // number is now 90 - number /= 2; // number is now 45 - - // Thread 1 finishes executing. - number /= 4; // number is now 11, instead of 10 - \endcode - - If we add a mutex, we should get the result we want: - - \code - TQMutex mutex; - int number = 6; - - void method1() - { - mutex.lock(); - number *= 5; - number /= 4; - mutex.unlock(); - } - - void method2() - { - mutex.lock(); - number *= 3; - number /= 2; - mutex.unlock(); - } - \endcode - - Then only one thread can modify \c number at any given time and - the result is correct. This is a trivial example, of course, but - applies to any other case where things need to happen in a - particular sequence. - - When you call lock() in a thread, other threads that try to call - lock() in the same place will block until the thread that got the - lock calls unlock(). A non-blocking alternative to lock() is - tryLock(). -*/ - -/*! - Constructs a new mutex. The mutex is created in an unlocked state. - A recursive mutex is created if \a recursive is TRUE; a normal - mutex is created if \a recursive is FALSE (the default). With a - recursive mutex, a thread can lock the same mutex multiple times - and it will not be unlocked until a corresponding number of - unlock() calls have been made. -*/ -TQMutex::TQMutex(bool recursive) -{ -#ifndef TQ_RECURSIVE_MUTEX_TYPE - if ( recursive ) - d = new TQRecursiveMutexPrivate(); - else -#endif // !TQ_RECURSIVE_MUTEX_TYPE - d = new TQRealMutexPrivate(recursive); -} - -/*! - Destroys the mutex. - - \warning If you destroy a mutex that still holds a lock the - resultant behavior is undefined. -*/ -TQMutex::~TQMutex() -{ - delete d; -} - -/*! - Attempt to lock the mutex. If another thread has locked the mutex - then this call will \e block until that thread has unlocked it. - - \sa unlock(), locked() -*/ -void TQMutex::lock() -{ - d->lock(); -} - -/*! - Unlocks the mutex. Attempting to unlock a mutex in a different - thread to the one that locked it results in an error. Unlocking a - mutex that is not locked results in undefined behaviour (varies - between different Operating Systems' thread implementations). - - \sa lock(), locked() -*/ -void TQMutex::unlock() -{ - d->unlock(); -} - -/*! - Returns TRUE if the mutex is locked by another thread; otherwise - returns FALSE. - - \warning Due to differing implementations of recursive mutexes on - various platforms, calling this function from the same thread that - previously locked the mutex will return undefined results. - - \sa lock(), unlock() -*/ -bool TQMutex::locked() -{ - return d->locked(); -} - -/*! - Attempt to lock the mutex. If the lock was obtained, this function - returns TRUE. If another thread has locked the mutex, this - function returns FALSE, instead of waiting for the mutex to become - available, i.e. it does not block. - - If the lock was obtained, the mutex must be unlocked with unlock() - before another thread can successfully lock it. - - \sa lock(), unlock(), locked() -*/ -bool TQMutex::tryLock() -{ - return d->trylock(); -} - -/*! - \class TQMutexLocker tqmutex.h - \brief The TQMutexLocker class simplifies locking and unlocking TQMutexes. - - \threadsafe - - \ingroup thread - \ingroup environment - - The purpose of TQMutexLocker is to simplify TQMutex locking and - unlocking. Locking and unlocking a TQMutex in complex functions and - statements or in exception handling code is error prone and - difficult to debug. TQMutexLocker should be used in such situations - to ensure that the state of the mutex is well defined and always - locked and unlocked properly. - - TQMutexLocker should be created within a function where a TQMutex - needs to be locked. The mutex is locked when TQMutexLocker is - created, and unlocked when TQMutexLocker is destroyed. - - For example, this complex function locks a TQMutex upon entering - the function and unlocks the mutex at all the exit points: - - \code - int complexFunction( int flag ) - { - mutex.lock(); - - int return_value = 0; - - switch ( flag ) { - case 0: - case 1: - { - mutex.unlock(); - return moreComplexFunction( flag ); - } - - case 2: - { - int status = anotherFunction(); - if ( status < 0 ) { - mutex.unlock(); - return -2; - } - return_value = status + flag; - break; - } - - default: - { - if ( flag > 10 ) { - mutex.unlock(); - return -1; - } - break; - } - } - - mutex.unlock(); - return return_value; - } - \endcode - - This example function will get more complicated as it is - developed, which increases the likelihood that errors will occur. - - Using TQMutexLocker greatly simplifies the code, and makes it more - readable: - - \code - int complexFunction( int flag ) - { - TQMutexLocker locker( &mutex ); - - int return_value = 0; - - switch ( flag ) { - case 0: - case 1: - { - return moreComplexFunction( flag ); - } - - case 2: - { - int status = anotherFunction(); - if ( status < 0 ) - return -2; - return_value = status + flag; - break; - } - - default: - { - if ( flag > 10 ) - return -1; - break; - } - } - - return return_value; - } - \endcode - - Now, the mutex will always be unlocked when the TQMutexLocker - object is destroyed (when the function returns since \c locker is - an auto variable). Note that the mutex will be unlocked after - the call to moreComplexFunction() in this example, avoiding - possible bugs caused by unlocking the mutex too early, as in - the first example. - - The same principle applies to code that throws and catches - exceptions. An exception that is not caught in the function that - has locked the mutex has no way of unlocking the mutex before the - exception is passed up the stack to the calling function. - - TQMutexLocker also provides a mutex() member function that returns - the mutex on which the TQMutexLocker is operating. This is useful - for code that needs access to the mutex, such as - TQWaitCondition::wait(). For example: - - \code - class SignalWaiter - { - private: - TQMutexLocker locker; - - public: - SignalWaiter( TQMutex *mutex ) - : locker( mutex ) - { - } - - void waitForSignal() - { - ... - ... - ... - - while ( ! signalled ) - waitcondition.wait( locker.mutex() ); - - ... - ... - ... - } - }; - \endcode - - \sa TQMutex, TQWaitCondition -*/ - -/*! - \fn TQMutexLocker::TQMutexLocker( TQMutex *mutex ) - - Constructs a TQMutexLocker and locks \a mutex. The mutex will be - unlocked when the TQMutexLocker is destroyed. If \a mutex is zero, - TQMutexLocker does nothing. - - \sa TQMutex::lock() -*/ - -/*! - \fn TQMutexLocker::~TQMutexLocker() - - Destroys the TQMutexLocker and unlocks the mutex which was locked - in the constructor. - - \sa TQMutexLocker::TQMutexLocker(), TQMutex::unlock() -*/ - -/*! - \fn TQMutex *TQMutexLocker::mutex() const - - Returns a pointer to the mutex which was locked in the - constructor. - - \sa TQMutexLocker::TQMutexLocker() -*/ - -#endif // TQT_THREAD_SUPPORT diff --git a/tqtinterface/qt4/src/tools/tqmutexpool.cpp b/tqtinterface/qt4/src/tools/tqmutexpool.cpp deleted file mode 100644 index 3b14922..0000000 --- a/tqtinterface/qt4/src/tools/tqmutexpool.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/**************************************************************************** -** -** ... -** -** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqmutexpool_p.h" - -#ifdef TQT_THREAD_SUPPORT - -#include <tqthread.h> - -TQ_EXPORT TQMutexPool *tqt_global_mutexpool = 0; - - -/*! - \class TQMutexPool qmutexpool_p.h - \brief The TQMutexPool class provides a pool of TQMutex objects. - - \internal - - \ingroup thread - - TQMutexPool is a convenience class that provides access to a fixed - number of TQMutex objects. - - Typical use of a TQMutexPool is in situations where it is not - possible or feasible to use one TQMutex for every protected object. - The mutex pool will return a mutex based on the address of the - object that needs protection. - - For example, consider this simple class: - - \code - class Number { - public: - Number( double n ) : num ( n ) { } - - void setNumber( double n ) { num = n; } - double number() const { return num; } - - private: - double num; - }; - \endcode - - Adding a TQMutex member to the Number class does not make sense, - because it is so small. However, in order to ensure that access to - each Number is protected, you need to use a mutex. In this case, a - TQMutexPool would be ideal. - - Code to calculate the square of a number would then look something - like this: - - \code - void calcSquare( Number *num ) - { - TQMutexLocker locker( mutexpool.get( num ) ); - num.setNumber( num.number() * num.number() ); - } - \endcode - - This function will safely calculate the square of a number, since - it uses a mutex from a TQMutexPool. The mutex is locked and - unlocked automatically by the TQMutexLocker class. See the - TQMutexLocker documentation for more details. -*/ - -/*! - Constructs a TQMutexPool, reserving space for \a size TQMutexes. If - \a recursive is TRUE, all TQMutexes in the pool will be recursive - mutexes; otherwise they will all be non-recursive (the default). - - The TQMutexes are created when needed, and deleted when the - TQMutexPool is destructed. -*/ -TQMutexPool::TQMutexPool( bool recursive, int size ) - : mutex( FALSE ), count( size ), recurs( recursive ) -{ - mutexes = new TQMutex*[count]; - for ( int index = 0; index < count; ++index ) { - mutexes[index] = 0; - } -} - -/*! - Destructs a TQMutexPool. All TQMutexes that were created by the pool - are deleted. -*/ -TQMutexPool::~TQMutexPool() -{ - TQMutexLocker locker( &mutex ); - for ( int index = 0; index < count; ++index ) { - delete mutexes[index]; - mutexes[index] = 0; - } - delete [] mutexes; - mutexes = 0; -} - -/*! - Returns a TQMutex from the pool. TQMutexPool uses the value \a - address to determine which mutex is retured from the pool. -*/ -TQMutex *TQMutexPool::get( void *address ) -{ - int index = (int) ( (unsigned long) address % count ); - - if ( ! mutexes[index] ) { - // mutex not created, create one - - TQMutexLocker locker( &mutex ); - // we need to check once again that the mutex hasn't been created, since - // 2 threads could be trying to create a mutex as the same index... - if ( ! mutexes[index] ) { - mutexes[index] = new TQMutex( recurs ); - } - } - - return mutexes[index]; -} - -#endif diff --git a/tqtinterface/qt4/src/tools/tqmutexpool_p.h b/tqtinterface/qt4/src/tools/tqmutexpool_p.h deleted file mode 100644 index 4293274..0000000 --- a/tqtinterface/qt4/src/tools/tqmutexpool_p.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** ... -** -** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQMUTEXPOOL_P_H -#define TQMUTEXPOOL_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of TQSettings. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// -// - -#ifdef TQT_THREAD_SUPPORT - -#ifndef TQT_H -#include "tqmutex.h" -#include "tqmemarray.h" -#endif // TQT_H - -class TQ_EXPORT TQMutexPool -{ -public: - TQMutexPool( bool recursive = FALSE, int size = 17 ); - ~TQMutexPool(); - - TQMutex *get( void *address ); - -private: - TQMutex mutex; - TQMutex **mutexes; - int count; - bool recurs; -}; - -extern TQ_EXPORT TQMutexPool *tqt_global_mutexpool; - -#endif // TQT_THREAD_SUPPORT - -#endif // TQMUTEXPOOL_P_H diff --git a/tqtinterface/qt4/src/tools/tqpair.h b/tqtinterface/qt4/src/tools/tqpair.h deleted file mode 100644 index 0f1d743..0000000 --- a/tqtinterface/qt4/src/tools/tqpair.h +++ /dev/null @@ -1,109 +0,0 @@ -/**************************************************************************** -** -** Definition of TQPair class -** -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQPAIR_H -#define TQPAIR_H - -#ifndef TQT_H -#include "tqglobal.h" -#include "tqdatastream.h" -#endif // TQT_H - -template <class T1, class T2> -struct TQPair -{ - typedef T1 first_type; - typedef T2 second_type; - - TQPair() - : first( T1() ), second( T2() ) - {} - TQPair( const T1& t1, const T2& t2 ) - : first( t1 ), second( t2 ) - {} - - TQPair<T1, T2>& operator=(const TQPair<T1, T2>& other) - { - if (this != &other) { - first = other.first; - second = other.second; - } - return *this; - } - - T1 first; - T2 second; -}; - -template <class T1, class T2> -TQ_INLINE_TEMPLATES bool operator==( const TQPair<T1, T2>& x, const TQPair<T1, T2>& y ) -{ - return x.first == y.first && x.second == y.second; -} - -template <class T1, class T2> -TQ_INLINE_TEMPLATES bool operator<( const TQPair<T1, T2>& x, const TQPair<T1, T2>& y ) -{ - return x.first < y.first || - ( !( y.first < x.first ) && x.second < y.second ); -} - -template <class T1, class T2> -TQ_INLINE_TEMPLATES TQPair<T1, T2> tqMakePair( const T1& x, const T2& y ) -{ - return TQPair<T1, T2>( x, y ); -} - -#ifndef TQT_NO_DATASTREAM -template <class T1, class T2> -inline TQDataStream& operator>>( TQDataStream& s, TQPair<T1, T2>& p ) -{ - s >> p.first >> p.second; - return s; -} - -template <class T1, class T2> -inline TQDataStream& operator<<( TQDataStream& s, const TQPair<T1, T2>& p ) -{ - s << p.first << p.second; - return s; -} -#endif - -#endif diff --git a/tqtinterface/qt4/src/tools/tqpluginmanager_p.h b/tqtinterface/qt4/src/tools/tqpluginmanager_p.h deleted file mode 100644 index 58b9b26..0000000 --- a/tqtinterface/qt4/src/tools/tqpluginmanager_p.h +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** -** -** Definition of TQPluginManager class -** -** Created : 000101 -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQPLUGINMANAGER_P_H -#define TQPLUGINMANAGER_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of a number of TQt sources files. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// -// - -#include "tqgpluginmanager_p.h" - -#ifndef TQT_NO_COMPONENT - -template<class Type> -class TQPluginManager : public TQGPluginManager -{ -public: - TQPluginManager( const TQUuid& id, const QStringList& paths = TQString::null, const TQString &suffix = TQString::null, bool cs = TRUE ) - : TQGPluginManager( id, TQT_TQSTRINGLIST_OBJECT(paths), suffix, cs ) {} - TQRESULT queryInterface(const TQString& feature, Type** iface) const - { - return queryUnknownInterface( feature, (TQUnknownInterface**)iface ); - } -}; - -#endif //TQT_NO_COMPONENT - -#endif //TQPLUGINMANAGER_P_H diff --git a/tqtinterface/qt4/src/tools/tqptrcollection.cpp b/tqtinterface/qt4/src/tools/tqptrcollection.cpp deleted file mode 100644 index 481c272..0000000 --- a/tqtinterface/qt4/src/tools/tqptrcollection.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/**************************************************************************** -** -** Implementation of base class for all pointer based collection classes -** -** Created : 920820 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqptrcollection.h" - -/*! - \class TQPtrCollection tqptrcollection.h - \reentrant - \brief The TQPtrCollection class is the base class of most pointer-based TQt collections. - - \ingroup collection - \ingroup tools - - The TQPtrCollection class is an abstract base class for the TQt - \link collection.html collection classes\endlink TQDict, TQPtrList, - etc. TQt also includes value based collections, e.g. TQValueList, - TQMap, etc. - - A TQPtrCollection only knows about the number of objects in the - collection and the deletion strategy (see setAutoDelete()). - - A collection is implemented using the \c Item (generic collection - item) type, which is a \c void*. The template classes that create - the real collections cast the \c Item to the required type. -*/ - - -/*! - \enum TQPtrCollection::Item - - This type is the generic "item" in a TQPtrCollection. -*/ - - -/*! - \fn TQPtrCollection::TQPtrCollection() - - Constructs a collection. The constructor is protected because - TQPtrCollection is an abstract class. -*/ - -/*! - \fn TQPtrCollection::TQPtrCollection( const TQPtrCollection & source ) - - Constructs a copy of \a source with autoDelete() set to FALSE. The - constructor is protected because TQPtrCollection is an abstract - class. - - Note that if \a source has autoDelete turned on, copying it will - risk memory leaks, reading freed memory, or both. -*/ - -/*! - \fn TQPtrCollection::~TQPtrCollection() - - Destroys the collection. The destructor is protected because - TQPtrCollection is an abstract class. -*/ - - -/*! - \fn bool TQPtrCollection::autoDelete() const - - Returns the setting of the auto-delete option. The default is FALSE. - - \sa setAutoDelete() -*/ - -/*! - \fn void TQPtrCollection::setAutoDelete( bool enable ) - - Sets the collection to auto-delete its contents if \a enable is - TRUE and to never delete them if \a enable is FALSE. - - If auto-deleting is turned on, all the items in a collection are - deleted when the collection itself is deleted. This is convenient - if the collection has the only pointer to the items. - - The default setting is FALSE, for safety. If you turn it on, be - careful about copying the collection - you might find yourself - with two collections deleting the same items. - - Note that the auto-delete setting may also affect other functions - in subclasses. For example, a subclass that has a remove() - function will remove the item from its data structure, and if - auto-delete is enabled, will also delete the item. - - \sa autoDelete() -*/ - - -/*! - \fn virtual uint TQPtrCollection::count() const - - Returns the number of objects in the collection. -*/ - -/*! - \fn virtual void TQPtrCollection::clear() - - Removes all objects from the collection. The objects will be - deleted if auto-delete has been enabled. - - \sa setAutoDelete() -*/ - -/*! - \fn void TQPtrCollection::deleteItem( Item d ) - - Reimplement this function if you want to be able to delete items. - - Deletes an item that is about to be removed from the collection. - - This function has to reimplemented in the collection template - classes, and should \e only delete item \a d if auto-delete has - been enabled. - - \warning If you reimplement this function you must also - reimplement the destructor and call the virtual function clear() - from your destructor. This is due to the way virtual functions and - destructors work in C++: Virtual functions in derived classes - cannot be called from a destructor. If you do not do this, your - deleteItem() function will not be called when the container is - destroyed. - - \sa newItem(), setAutoDelete() -*/ - -/*! - Virtual function that creates a copy of an object that is about to - be inserted into the collection. - - The default implementation returns the \a d pointer, i.e. no copy - is made. - - This function is seldom reimplemented in the collection template - classes. It is not common practice to make a copy of something - that is being inserted. - - \sa deleteItem() -*/ - -TQPtrCollection::Item TQPtrCollection::newItem( Item d ) -{ - return d; // just return reference -} diff --git a/tqtinterface/qt4/src/tools/tqptrcollection.h b/tqtinterface/qt4/src/tools/tqptrcollection.h deleted file mode 100644 index 86bc2e2..0000000 --- a/tqtinterface/qt4/src/tools/tqptrcollection.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Definition of base class for all pointer based collection classes -** -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQPTRCOLLECTION_H -#define TQPTRCOLLECTION_H - -#ifndef TQT_H -#include "tqglobal.h" -#endif // TQT_H - - -class TQGVector; -class TQGList; -class TQGDict; - - -class TQ_EXPORT TQPtrCollection // inherited by all collections -{ -public: - bool autoDelete() const { return del_item; } - void setAutoDelete( bool enable ) { del_item = enable; } - - virtual uint count() const = 0; - virtual void clear() = 0; // delete all objects - - typedef void *Item; // generic collection item - -protected: - TQPtrCollection() { del_item = FALSE; } // no deletion of objects - TQPtrCollection(const TQPtrCollection &) { del_item = FALSE; } - virtual ~TQPtrCollection() {} - - bool del_item; // default FALSE - - virtual Item newItem( Item ); // create object - virtual void deleteItem( Item ) = 0; // delete object -}; - - -#ifndef TQT_NO_COMPAT -#define TQCollection TQPtrCollection -#endif - -#endif // TQPTRCOLLECTION_H diff --git a/tqtinterface/qt4/src/tools/tqptrdict.h b/tqtinterface/qt4/src/tools/tqptrdict.h deleted file mode 100644 index 882872e..0000000 --- a/tqtinterface/qt4/src/tools/tqptrdict.h +++ /dev/null @@ -1,118 +0,0 @@ -/**************************************************************************** -** -** Definition of TQPtrDict template class -** -** Created : 970415 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQPTRDICT_H -#define TQPTRDICT_H - -#ifndef TQT_H -#include "tqgdict.h" -#endif // TQT_H - -template<class type> -class TQPtrDict -#ifdef TQ_TQDOC - : public TQPtrCollection -#else - : public TQGDict -#endif -{ -public: - TQPtrDict(int size=17) : TQGDict(size,PtrKey,0,0) {} - TQPtrDict( const TQPtrDict<type> &d ) : TQGDict(d) {} - ~TQPtrDict() { clear(); } - TQPtrDict<type> &operator=(const TQPtrDict<type> &d) - { return (TQPtrDict<type>&)TQGDict::operator=(d); } - uint count() const { return TQGDict::count(); } - uint size() const { return TQGDict::size(); } - bool isEmpty() const { return TQGDict::count() == 0; } - void insert( void *k, const type *d ) - { TQGDict::look_ptr(k,(Item)d,1); } - void replace( void *k, const type *d ) - { TQGDict::look_ptr(k,(Item)d,2); } - bool remove( void *k ) { return TQGDict::remove_ptr(k); } - type *take( void *k ) { return (type*)TQGDict::take_ptr(k); } - type *find( void *k ) const - { return (type *)((TQGDict*)this)->TQGDict::look_ptr(k,0,0); } - type *operator[]( void *k ) const - { return (type *)((TQGDict*)this)->TQGDict::look_ptr(k,0,0); } - void clear() { TQGDict::clear(); } - void resize( uint n ) { TQGDict::resize(n); } - void statistics() const { TQGDict::statistics(); } - -#ifdef TQ_TQDOC -protected: - virtual TQDataStream& read( TQDataStream &, TQPtrCollection::Item & ); - virtual TQDataStream& write( TQDataStream &, TQPtrCollection::Item ) const; -#endif - -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQPtrDict<void>::deleteItem( TQPtrCollection::Item ) -{ -} -#endif - -template<class type> -inline void TQPtrDict<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type *)d; -} - -template<class type> -class TQPtrDictIterator : public TQGDictIterator -{ -public: - TQPtrDictIterator(const TQPtrDict<type> &d) :TQGDictIterator((TQGDict &)d) {} - ~TQPtrDictIterator() {} - uint count() const { return dict->count(); } - bool isEmpty() const { return dict->count() == 0; } - type *toFirst() { return (type *)TQGDictIterator::toFirst(); } - operator type *() const { return (type *)TQGDictIterator::get(); } - type *current() const { return (type *)TQGDictIterator::get(); } - void *currentKey() const { return TQGDictIterator::getKeyPtr(); } - type *operator()() { return (type *)TQGDictIterator::operator()(); } - type *operator++() { return (type *)TQGDictIterator::operator++(); } - type *operator+=(uint j) { return (type *)TQGDictIterator::operator+=(j);} -}; - -#endif // TQPTRDICT_H diff --git a/tqtinterface/qt4/src/tools/tqptrlist.h b/tqtinterface/qt4/src/tools/tqptrlist.h deleted file mode 100644 index 25f7e1b..0000000 --- a/tqtinterface/qt4/src/tools/tqptrlist.h +++ /dev/null @@ -1,197 +0,0 @@ -/**************************************************************************** -** -** Definition of TQPtrList template/macro class -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQPTRLIST_H -#define TQPTRLIST_H - -#ifndef TQT_H -#include "tqglist.h" -#endif // TQT_H - -template<class type> -class TQPtrListStdIterator : public TQGListStdIterator -{ -public: - inline TQPtrListStdIterator( TQLNode* n ): TQGListStdIterator(n) {} - type *operator*() { return node ? (type *)node->getData() : 0; } - inline TQPtrListStdIterator<type> operator++() - { node = next(); return *this; } - inline TQPtrListStdIterator<type> operator++(int) - { TQLNode* n = node; node = next(); return TQPtrListStdIterator<type>( n ); } - inline bool operator==( const TQPtrListStdIterator<type>& it ) const { return node == it.node; } - inline bool operator!=( const TQPtrListStdIterator<type>& it ) const { return node != it.node; } -}; - - -template<class type> -class TQPtrList -#ifdef TQ_TQDOC - : public TQPtrCollection -#else - : public TQGList -#endif -{ -public: - - TQPtrList() {} - TQPtrList( const TQPtrList<type> &l ) : TQGList(l) {} - ~TQPtrList() { clear(); } - TQPtrList<type> &operator=(const TQPtrList<type> &l) - { return (TQPtrList<type>&)TQGList::operator=(l); } - bool operator==( const TQPtrList<type> &list ) const - { return TQGList::operator==( list ); } - bool operator!=( const TQPtrList<type> &list ) const - { return !TQGList::operator==( list ); } - uint count() const { return TQGList::count(); } - bool isEmpty() const { return TQGList::count() == 0; } - bool insert( uint i, const type *d){ return TQGList::insertAt(i,(TQPtrCollection::Item)d); } - void inSort( const type *d ) { TQGList::inSort((TQPtrCollection::Item)d); } - void prepend( const type *d ) { TQGList::insertAt(0,(TQPtrCollection::Item)d); } - void append( const type *d ) { TQGList::append((TQPtrCollection::Item)d); } - bool remove( uint i ) { return TQGList::removeAt(i); } - bool remove() { return TQGList::remove((TQPtrCollection::Item)0); } - bool remove( const type *d ) { return TQGList::remove((TQPtrCollection::Item)d); } - bool removeRef( const type *d ) { return TQGList::removeRef((TQPtrCollection::Item)d); } - void removeNode( TQLNode *n ) { TQGList::removeNode(n); } - bool removeFirst() { return TQGList::removeFirst(); } - bool removeLast() { return TQGList::removeLast(); } - type *take( uint i ) { return (type *)TQGList::takeAt(i); } - type *take() { return (type *)TQGList::take(); } - type *takeNode( TQLNode *n ) { return (type *)TQGList::takeNode(n); } - void clear() { TQGList::clear(); } - void sort() { TQGList::sort(); } - int find( const type *d ) { return TQGList::find((TQPtrCollection::Item)d); } - int findNext( const type *d ) { return TQGList::find((TQPtrCollection::Item)d,FALSE); } - int findRef( const type *d ) { return TQGList::findRef((TQPtrCollection::Item)d); } - int findNextRef( const type *d ){ return TQGList::findRef((TQPtrCollection::Item)d,FALSE);} - uint contains( const type *d ) const { return TQGList::contains((TQPtrCollection::Item)d); } - uint containsRef( const type *d ) const - { return TQGList::containsRef((TQPtrCollection::Item)d); } - bool replace( uint i, const type *d ) { return TQGList::replaceAt( i, (TQPtrCollection::Item)d ); } - type *at( uint i ) { return (type *)TQGList::at(i); } - type *tqat( uint i ) { return (type *)TQGList::at(i); } - int at() const { return TQGList::at(); } - int tqat() const { return TQGList::at(); } - type *current() const { return (type *)TQGList::get(); } - TQLNode *currentNode() const { return TQGList::currentNode(); } - type *getFirst() const { return (type *)TQGList::cfirst(); } - type *getLast() const { return (type *)TQGList::clast(); } - type *first() { return (type *)TQGList::first(); } - type *last() { return (type *)TQGList::last(); } - type *next() { return (type *)TQGList::next(); } - type *prev() { return (type *)TQGList::prev(); } - void toVector( TQGVector *vec )const{ TQGList::toVector(vec); } - - - // standard iterators - typedef TQPtrListStdIterator<type> Iterator; - typedef TQPtrListStdIterator<type> ConstIterator; - inline Iterator begin() { return TQGList::begin(); } - inline ConstIterator begin() const { return TQGList::begin(); } - inline ConstIterator constBegin() const { return TQGList::begin(); } - inline Iterator end() { return TQGList::end(); } - inline ConstIterator end() const { return TQGList::end(); } - inline ConstIterator constEnd() const { return TQGList::end(); } - inline Iterator erase( Iterator it ) { return TQGList::erase( it ); } - // stl syntax compatibility - typedef Iterator iterator; - typedef ConstIterator const_iterator; - - -#ifdef TQ_TQDOC -protected: - virtual int compareItems( TQPtrCollection::Item, TQPtrCollection::Item ); - virtual TQDataStream& read( TQDataStream&, TQPtrCollection::Item& ); - virtual TQDataStream& write( TQDataStream&, TQPtrCollection::Item ) const; -#endif - -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQPtrList<void>::deleteItem( TQPtrCollection::Item ) -{ -} -#endif - -template<class type> inline void TQPtrList<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type *)d; -} - -template<class type> -class TQPtrListIterator : public TQGListIterator -{ -public: - TQPtrListIterator(const TQPtrList<type> &l) :TQGListIterator((TQGList &)l) {} - ~TQPtrListIterator() {} - uint count() const { return list->count(); } - bool isEmpty() const { return list->count() == 0; } - bool atFirst() const { return TQGListIterator::atFirst(); } - bool atLast() const { return TQGListIterator::atLast(); } - type *toFirst() { return (type *)TQGListIterator::toFirst(); } - type *toLast() { return (type *)TQGListIterator::toLast(); } - operator type *() const { return (type *)TQGListIterator::get(); } - type *operator*() { return (type *)TQGListIterator::get(); } - - // No good, since TQPtrList<char> (ie. TQStrList fails... - // - // MSVC++ gives warning - // Sunpro C++ 4.1 gives error - // type *operator->() { return (type *)TQGListIterator::get(); } - - type *current() const { return (type *)TQGListIterator::get(); } - type *operator()() { return (type *)TQGListIterator::operator()();} - type *operator++() { return (type *)TQGListIterator::operator++(); } - type *operator+=(uint j) { return (type *)TQGListIterator::operator+=(j);} - type *operator--() { return (type *)TQGListIterator::operator--(); } - type *operator-=(uint j) { return (type *)TQGListIterator::operator-=(j);} - TQPtrListIterator<type>& operator=(const TQPtrListIterator<type>&it) - { TQGListIterator::operator=(it); return *this; } -}; - -#ifndef TQT_NO_COMPAT -#define TQList TQPtrList -#define TQListIterator TQPtrListIterator -#endif - -#define TQ_DEFINED_TQPTRLIST -#include "tqwinexport.h" - -#endif // TQPTRLIST_H diff --git a/tqtinterface/qt4/src/tools/tqptrqueue.h b/tqtinterface/qt4/src/tools/tqptrqueue.h deleted file mode 100644 index d7122cd..0000000 --- a/tqtinterface/qt4/src/tools/tqptrqueue.h +++ /dev/null @@ -1,94 +0,0 @@ -/**************************************************************************** -** -** Definition of TQPtrQueue template/macro class -** -** Created : 920917 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQPTRTQUEUE_H -#define TQPTRTQUEUE_H - -#ifndef TQT_H -#include "tqglist.h" -#endif // TQT_H - -template<class type> -class TQPtrQueue : protected TQGList -{ -public: - TQPtrQueue() {} - TQPtrQueue( const TQPtrQueue<type> &q ) : TQGList(q) {} - ~TQPtrQueue() { clear(); } - TQPtrQueue<type>& operator=(const TQPtrQueue<type> &q) - { return (TQPtrQueue<type>&)TQGList::operator=(q); } - bool autoDelete() const { return TQPtrCollection::autoDelete(); } - void setAutoDelete( bool del ) { TQPtrCollection::setAutoDelete(del); } - uint count() const { return TQGList::count(); } - bool isEmpty() const { return TQGList::count() == 0; } - void enqueue( const type *d ) { TQGList::append(Item(d)); } - type *dequeue() { return (type *)TQGList::takeFirst();} - bool remove() { return TQGList::removeFirst(); } - void clear() { TQGList::clear(); } - type *head() const { return (type *)TQGList::cfirst(); } - operator type *() const { return (type *)TQGList::cfirst(); } - type *current() const { return (type *)TQGList::cfirst(); } - -#ifdef TQ_TQDOC -protected: - virtual TQDataStream& read( TQDataStream&, TQPtrCollection::Item& ); - virtual TQDataStream& write( TQDataStream&, TQPtrCollection::Item ) const; -#endif - -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQPtrQueue<void>::deleteItem( TQPtrCollection::Item ) -{ -} -#endif - -template<class type> inline void TQPtrQueue<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type *)d; -} - -#ifndef TQT_NO_COMPAT -#define TQQueue TQPtrQueue -#endif - -#endif // TQPTRTQUEUE_H diff --git a/tqtinterface/qt4/src/tools/tqptrstack.h b/tqtinterface/qt4/src/tools/tqptrstack.h deleted file mode 100644 index 1ab0d65..0000000 --- a/tqtinterface/qt4/src/tools/tqptrstack.h +++ /dev/null @@ -1,94 +0,0 @@ -/**************************************************************************** -** -** Definition of TQPtrStack pointer based template class -** -** Created : 920917 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQPTRSTACK_H -#define TQPTRSTACK_H - -#ifndef TQT_H -#include "tqglist.h" -#endif // TQT_H - -template<class type> -class TQPtrStack : protected TQGList -{ -public: - TQPtrStack() { } - TQPtrStack( const TQPtrStack<type> &s ) : TQGList( s ) { } - ~TQPtrStack() { clear(); } - TQPtrStack<type> &operator=(const TQPtrStack<type> &s) - { return (TQPtrStack<type>&)TQGList::operator=(s); } - bool autoDelete() const { return TQPtrCollection::autoDelete(); } - void setAutoDelete( bool del ) { TQPtrCollection::setAutoDelete(del); } - uint count() const { return TQGList::count(); } - bool isEmpty() const { return TQGList::count() == 0; } - void push( const type *d ) { TQGList::insertAt(0,Item(d)); } - type *pop() { return (type *)TQGList::takeFirst(); } - bool remove() { return TQGList::removeFirst(); } - void clear() { TQGList::clear(); } - type *top() const { return (type *)TQGList::cfirst(); } - operator type *() const { return (type *)TQGList::cfirst(); } - type *current() const { return (type *)TQGList::cfirst(); } - -#ifdef TQ_TQDOC -protected: - virtual TQDataStream& read( TQDataStream&, TQPtrCollection::Item& ); - virtual TQDataStream& write( TQDataStream&, TQPtrCollection::Item ) const; -#endif - -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQPtrStack<void>::deleteItem( TQPtrCollection::Item ) -{ -} -#endif - -template<class type> inline void TQPtrStack<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type *)d; -} - -#ifndef TQT_NO_COMPAT -#define TQStack TQPtrStack -#endif - -#endif // TQPTRSTACK_H diff --git a/tqtinterface/qt4/src/tools/tqptrvector.h b/tqtinterface/qt4/src/tools/tqptrvector.h deleted file mode 100644 index 14164ca..0000000 --- a/tqtinterface/qt4/src/tools/tqptrvector.h +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************************** -** -** Definition of TQPtrVector pointer based template class -** -** Created : 930907 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQPTRVECTOR_H -#define TQPTRVECTOR_H - -#ifndef TQT_H -#include "tqgvector.h" -#endif // TQT_H - -template<class type> -class TQPtrVector -#ifdef TQ_TQDOC - : public TQPtrCollection -#else - : public TQGVector -#endif -{ -public: - TQPtrVector() { } - TQPtrVector( uint size ) : TQGVector(size) { } - TQPtrVector( const TQPtrVector<type> &v ) : TQGVector( v ) { } - ~TQPtrVector() { clear(); } - TQPtrVector<type> &operator=(const TQPtrVector<type> &v) - { return (TQPtrVector<type>&)TQGVector::operator=(v); } - bool operator==( const TQPtrVector<type> &v ) const { return TQGVector::operator==(v); } - type **data() const { return (type **)TQGVector::data(); } - uint size() const { return TQGVector::size(); } - uint count() const { return TQGVector::count(); } - bool isEmpty() const { return TQGVector::count() == 0; } - bool isNull() const { return TQGVector::size() == 0; } - bool resize( uint size ) { return TQGVector::resize(size); } - bool insert( uint i, const type *d){ return TQGVector::insert(i,(Item)d); } - bool remove( uint i ) { return TQGVector::remove(i); } - type *take( uint i ) { return (type *)TQGVector::take(i); } - void clear() { TQGVector::clear(); } - bool fill( const type *d, int size=-1 ) - { return TQGVector::fill((Item)d,size);} - void sort() { TQGVector::sort(); } - int bsearch( const type *d ) const{ return TQGVector::bsearch((Item)d); } - int findRef( const type *d, uint i=0 ) const - { return TQGVector::findRef((Item)d,i);} - int find( const type *d, uint i= 0 ) const - { return TQGVector::find((Item)d,i); } - uint containsRef( const type *d ) const - { return TQGVector::containsRef((Item)d); } - uint contains( const type *d ) const - { return TQGVector::contains((Item)d); } - type *operator[]( int i ) const { return (type *)TQGVector::at(i); } - type *at( uint i ) const { return (type *)TQGVector::at(i); } - type *tqat( uint i ) const { return (type *)TQGVector::at(i); } - void toList( TQGList *list ) const { TQGVector::toList(list); } - -#ifdef TQ_TQDOC -protected: - virtual int compareItems( TQPtrCollection::Item d1, TQPtrCollection::Item d2 ); - virtual TQDataStream& read( TQDataStream &s, TQPtrCollection::Item &d ); - virtual TQDataStream& write( TQDataStream &s, TQPtrCollection::Item d ) const; -#endif - -private: - void deleteItem( Item d ); -}; - -#if !defined(TQ_BROKEN_TEMPLATE_SPECIALIZATION) -template<> inline void TQPtrVector<void>::deleteItem( TQPtrCollection::Item ) -{ -} -#endif - -template<class type> inline void TQPtrVector<type>::deleteItem( TQPtrCollection::Item d ) -{ - if ( del_item ) delete (type *)d; -} - -#ifndef TQT_NO_COMPAT -#define TQVector TQPtrVector -#endif - -#define TQ_DEFINED_TQPTRVECTOR -#include "tqwinexport.h" -#endif // TQVECTOR_H diff --git a/tqtinterface/qt4/src/tools/tqregexp.cpp b/tqtinterface/qt4/src/tools/tqregexp.cpp deleted file mode 100644 index 7a7f1ab..0000000 --- a/tqtinterface/qt4/src/tools/tqregexp.cpp +++ /dev/null @@ -1,4050 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQRegExp class -** -** Created : 950126 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqregexp.h" - -#ifndef TQT_NO_REGEXP - -#include "tqmemarray.h" -#include "tqbitarray.h" -#include "tqcache.h" -#include "tqcleanuphandler.h" -#include "tqintdict.h" -#include "tqmap.h" -#include "tqptrvector.h" -#include "tqstring.h" -#include "tqtl.h" - -#ifdef TQT_THREAD_SUPPORT -#include "tqthreadstorage.h" -#include <private/tqthreadinstance_p.h> -#endif // TQT_THREAD_SUPPORT - -#undef TQT_TRANSLATE_NOOP -#define TQT_TRANSLATE_NOOP( context, sourceText ) sourceText - -#include <limits.h> - -// error strings for the regexp parser -#define RXERR_OK TQT_TRANSLATE_NOOP( "TQRegExp", "no error occurred" ) -#define RXERR_DISABLED TQT_TRANSLATE_NOOP( "TQRegExp", "disabled feature used" ) -#define RXERR_CHARCLASS TQT_TRANSLATE_NOOP( "TQRegExp", "bad char class syntax" ) -#define RXERR_LOOKAHEAD TQT_TRANSLATE_NOOP( "TQRegExp", "bad lookahead syntax" ) -#define RXERR_REPETITION TQT_TRANSLATE_NOOP( "TQRegExp", "bad repetition syntax" ) -#define RXERR_OCTAL TQT_TRANSLATE_NOOP( "TQRegExp", "invalid octal value" ) -#define RXERR_LEFTDELIM TQT_TRANSLATE_NOOP( "TQRegExp", "missing left delim" ) -#define RXERR_END TQT_TRANSLATE_NOOP( "TQRegExp", "unexpected end" ) -#define RXERR_LIMIT TQT_TRANSLATE_NOOP( "TQRegExp", "met internal limit" ) - -#ifdef USE_QT4 - -/*! - QT4 INTEROPERABILITY -*/ -int TQRegExp::search( const TQString& str, int offset ) const -{ - return indexIn( str, offset, CaretAtZero); -} - -/*! - QT4 INTEROPERABILITY -*/ -int TQRegExp::search( const TQString& str, int offset, CaretMode caretMode ) const -{ - return indexIn( str, offset, caretMode); -} - -/*! - QT4 INTEROPERABILITY -*/ -int TQRegExp::searchRev( const TQString& str, int offset ) const -{ - return lastIndexIn( str, offset, CaretAtZero); -} - -/*! - QT4 INTEROPERABILITY -*/ -int TQRegExp::searchRev( const TQString& str, int offset, CaretMode caretMode ) const -{ - return lastIndexIn( str, offset, caretMode); -} - -/*! - QT4 INTEROPERABILITY -*/ -bool TQRegExp::caseSensitive() const -{ - return caseSensitivity(); -} - -/*! - QT4 INTEROPERABILITY -*/ -void TQRegExp::setCaseSensitive( bool sensitive ) -{ - setCaseSensitivity( (Qt::CaseSensitivity)sensitive); -} - -#else // USE_QT4 - -/* - WARNING! Be sure to read qregexp.tex before modifying this file. -*/ - -/*! - \class TQRegExp tqregexp.h - \reentrant - \brief The TQRegExp class provides pattern matching using regular expressions. - - \ingroup tools - \ingroup misc - \ingroup shared - \mainclass - \keyword regular expression - - Regular expressions, or "regexps", provide a way to find patterns - within text. This is useful in many contexts, for example: - - \table - \row \i Validation - \i A regexp can be used to check whether a piece of text - meets some criteria, e.g. is an integer or contains no - whitespace. - \row \i Searching - \i Regexps provide a much more powerful means of searching - text than simple string matching does. For example we can - create a regexp which says "find one of the words 'mail', - 'letter' or 'correspondence' but not any of the words - 'email', 'mailman' 'mailer', 'letterbox' etc." - \row \i Search and Replace - \i A regexp can be used to replace a pattern with a piece of - text, for example replace all occurrences of '&' with - '\&' except where the '&' is already followed by 'amp;'. - \row \i String Splitting - \i A regexp can be used to identify where a string should be - split into its component fields, e.g. splitting tab-delimited - strings. - \endtable - - We present a very brief introduction to regexps, a description of - TQt's regexp language, some code examples, and finally the function - documentation itself. TQRegExp is modeled on Perl's regexp - language, and also fully supports Unicode. TQRegExp can also be - used in the weaker 'wildcard' (globbing) mode which works in a - similar way to command shells. A good text on regexps is \e - {Mastering Regular Expressions: Powerful Techniques for Perl and - Other Tools} by Jeffrey E. Friedl, ISBN 1565922573. - - Experienced regexp users may prefer to skip the introduction and - go directly to the relevant information. - - In case of multi-threaded programming, note that TQRegExp depends on - TQThreadStorage internally. For that reason, TQRegExp should only be - used with threads started with TQThread, i.e. not with threads - started with platform-specific APIs. - - \tableofcontents - - \section1 Introduction - - Regexps are built up from expressions, quantifiers, and assertions. - The simplest form of expression is simply a character, e.g. - <b>x</b> or <b>5</b>. An expression can also be a set of - characters. For example, <b>[ABCD]</b>, will match an <b>A</b> or - a <b>B</b> or a <b>C</b> or a <b>D</b>. As a shorthand we could - write this as <b>[A-D]</b>. If we want to match any of the - captital letters in the English alphabet we can write - <b>[A-Z]</b>. A quantifier tells the regexp engine how many - occurrences of the expression we want, e.g. <b>x{1,1}</b> means - match an <b>x</b> which occurs at least once and at most once. - We'll look at assertions and more complex expressions later. - - Note that in general regexps cannot be used to check for balanced - brackets or tags. For example if you want to match an opening html - \c <b> and its closing \c </b> you can only use a regexp if you - know that these tags are not nested; the html fragment, \c{<b>bold - <b>bolder</b></b>} will not match as expected. If you know the - maximum level of nesting it is possible to create a regexp that - will match correctly, but for an unknown level of nesting, regexps - will fail. - - We'll start by writing a regexp to match integers in the range 0 - to 99. We will require at least one digit so we will start with - <b>[0-9]{1,1}</b> which means match a digit exactly once. This - regexp alone will match integers in the range 0 to 9. To match one - or two digits we can increase the maximum number of occurrences so - the regexp becomes <b>[0-9]{1,2}</b> meaning match a digit at - least once and at most twice. However, this regexp as it stands - will not match correctly. This regexp will match one or two digits - \e within a string. To ensure that we match against the whole - string we must use the anchor assertions. We need <b>^</b> (caret) - which when it is the first character in the regexp means that the - regexp must match from the beginning of the string. And we also - need <b>$</b> (dollar) which when it is the last character in the - regexp means that the regexp must match until the end of the - string. So now our regexp is <b>^[0-9]{1,2}$</b>. Note that - assertions, such as <b>^</b> and <b>$</b>, do not match any - characters. - - If you've seen regexps elsewhere they may have looked different from - the ones above. This is because some sets of characters and some - quantifiers are so common that they have special symbols to - represent them. <b>[0-9]</b> can be replaced with the symbol - <b>\d</b>. The quantifier to match exactly one occurrence, - <b>{1,1}</b>, can be replaced with the expression itself. This means - that <b>x{1,1}</b> is exactly the same as <b>x</b> alone. So our 0 - to 99 matcher could be written <b>^\d{1,2}$</b>. Another way of - writing it would be <b>^\d\d{0,1}$</b>, i.e. from the start of the - string match a digit followed by zero or one digits. In practice - most people would write it <b>^\d\d?$</b>. The <b>?</b> is a - shorthand for the quantifier <b>{0,1}</b>, i.e. a minimum of no - occurrences a maximum of one occurrence. This is used to make an - expression optional. The regexp <b>^\d\d?$</b> means "from the - beginning of the string match one digit followed by zero or one - digits and then the end of the string". - - Our second example is matching the words 'mail', 'letter' or - 'correspondence' but without matching 'email', 'mailman', - 'mailer', 'letterbox' etc. We'll start by just matching 'mail'. In - full the regexp is, <b>m{1,1}a{1,1}i{1,1}l{1,1}</b>, but since - each expression itself is automatically quantified by <b>{1,1}</b> - we can simply write this as <b>mail</b>; an 'm' followed by an 'a' - followed by an 'i' followed by an 'l'. The symbol '|' (bar) is - used for \e alternation, so our regexp now becomes - <b>mail|letter|correspondence</b> which means match 'mail' \e or - 'letter' \e or 'correspondence'. Whilst this regexp will find the - words we want it will also find words we don't want such as - 'email'. We will start by putting our regexp in parentheses, - <b>(mail|letter|correspondence)</b>. Parentheses have two effects, - firstly they group expressions together and secondly they identify - parts of the regexp that we wish to \link #capturing-text capture - \endlink. Our regexp still matches any of the three words but now - they are grouped together as a unit. This is useful for building - up more complex regexps. It is also useful because it allows us to - examine which of the words actually matched. We need to use - another assertion, this time <b>\b</b> "word boundary": - <b>\b(mail|letter|correspondence)\b</b>. This regexp means "match - a word boundary followed by the expression in parentheses followed - by another word boundary". The <b>\b</b> assertion matches at a \e - position in the regexp not a \e character in the regexp. A word - boundary is any non-word character such as a space a newline or - the beginning or end of the string. - - For our third example we want to replace ampersands with the HTML - entity '\&'. The regexp to match is simple: <b>\&</b>, i.e. - match one ampersand. Unfortunately this will mess up our text if - some of the ampersands have already been turned into HTML - entities. So what we really want to say is replace an ampersand - providing it is not followed by 'amp;'. For this we need the - negative lookahead assertion and our regexp becomes: - <b>\&(?!amp;)</b>. The negative lookahead assertion is introduced - with '(?!' and finishes at the ')'. It means that the text it - contains, 'amp;' in our example, must \e not follow the expression - that preceeds it. - - Regexps provide a rich language that can be used in a variety of - ways. For example suppose we want to count all the occurrences of - 'Eric' and 'Eirik' in a string. Two valid regexps to match these - are <b>\\b(Eric|Eirik)\\b</b> and <b>\\bEi?ri[ck]\\b</b>. We need - the word boundary '\b' so we don't get 'Ericsson' etc. The second - regexp actually matches more than we want, 'Eric', 'Erik', 'Eiric' - and 'Eirik'. - - We will implement some the examples above in the - \link #code-examples code examples \endlink section. - - \target characters-and-abbreviations-for-sets-of-characters - \section1 Characters and Abbreviations for Sets of Characters - - \table - \header \i Element \i Meaning - \row \i <b>c</b> - \i Any character represents itself unless it has a special - regexp meaning. Thus <b>c</b> matches the character \e c. - \row \i <b>\\c</b> - \i A character that follows a backslash matches the character - itself except where mentioned below. For example if you - wished to match a literal caret at the beginning of a string - you would write <b>\^</b>. - \row \i <b>\\a</b> - \i This matches the ASCII bell character (BEL, 0x07). - \row \i <b>\\f</b> - \i This matches the ASCII form feed character (FF, 0x0C). - \row \i <b>\\n</b> - \i This matches the ASCII line feed character (LF, 0x0A, Unix newline). - \row \i <b>\\r</b> - \i This matches the ASCII carriage return character (CR, 0x0D). - \row \i <b>\\t</b> - \i This matches the ASCII horizontal tab character (HT, 0x09). - \row \i <b>\\v</b> - \i This matches the ASCII vertical tab character (VT, 0x0B). - \row \i <b>\\xhhhh</b> - \i This matches the Unicode character corresponding to the - hexadecimal number hhhh (between 0x0000 and 0xFFFF). \0ooo - (i.e., \zero ooo) matches the ASCII/Latin-1 character - corresponding to the octal number ooo (between 0 and 0377). - \row \i <b>. (dot)</b> - \i This matches any character (including newline). - \row \i <b>\\d</b> - \i This matches a digit (TQChar::isDigit()). - \row \i <b>\\D</b> - \i This matches a non-digit. - \row \i <b>\\s</b> - \i This matches a whitespace (TQChar::isSpace()). - \row \i <b>\\S</b> - \i This matches a non-whitespace. - \row \i <b>\\w</b> - \i This matches a word character (TQChar::isLetterOrNumber() or '_'). - \row \i <b>\\W</b> - \i This matches a non-word character. - \row \i <b>\\n</b> - \i The n-th \link #capturing-text backreference \endlink, - e.g. \1, \2, etc. - \endtable - - \e {Note that the C++ compiler transforms backslashes in strings - so to include a <b>\\</b> in a regexp you will need to enter it - twice, i.e. <b>\\\\</b>.} - - \target sets-of-characters - \section1 Sets of Characters - - Square brackets are used to match any character in the set of - characters contained within the square brackets. All the character - set abbreviations described above can be used within square - brackets. Apart from the character set abbreviations and the - following two exceptions no characters have special meanings in - square brackets. - - \table - \row \i <b>^</b> - \i The caret negates the character set if it occurs as the - first character, i.e. immediately after the opening square - bracket. For example, <b>[abc]</b> matches 'a' or 'b' or 'c', - but <b>[^abc]</b> matches anything \e except 'a' or 'b' or - 'c'. - \row \i <b>-</b> - \i The dash is used to indicate a range of characters, for - example <b>[W-Z]</b> matches 'W' or 'X' or 'Y' or 'Z'. - \endtable - - Using the predefined character set abbreviations is more portable - than using character ranges across platforms and languages. For - example, <b>[0-9]</b> matches a digit in Western alphabets but - <b>\d</b> matches a digit in \e any alphabet. - - Note that in most regexp literature sets of characters are called - "character classes". - - \target quantifiers - \section1 Quantifiers - - By default an expression is automatically quantified by - <b>{1,1}</b>, i.e. it should occur exactly once. In the following - list <b>\e {E}</b> stands for any expression. An expression is a - character or an abbreviation for a set of characters or a set of - characters in square brackets or any parenthesised expression. - - \table - \row \i <b>\e {E}?</b> - \i Matches zero or one occurrence of \e E. This quantifier - means "the previous expression is optional" since it will - match whether or not the expression occurs in the string. It - is the same as <b>\e {E}{0,1}</b>. For example <b>dents?</b> - will match 'dent' and 'dents'. - - \row \i <b>\e {E}+</b> - \i Matches one or more occurrences of \e E. This is the same - as <b>\e {E}{1,MAXINT}</b>. For example, <b>0+</b> will match - '0', '00', '000', etc. - - \row \i <b>\e {E}*</b> - \i Matches zero or more occurrences of \e E. This is the same - as <b>\e {E}{0,MAXINT}</b>. The <b>*</b> quantifier is often - used by a mistake. Since it matches \e zero or more - occurrences it will match no occurrences at all. For example - if we want to match strings that end in whitespace and use - the regexp <b>\s*$</b> we would get a match on every string. - This is because we have said find zero or more whitespace - followed by the end of string, so even strings that don't end - in whitespace will match. The regexp we want in this case is - <b>\s+$</b> to match strings that have at least one - whitespace at the end. - - \row \i <b>\e {E}{n}</b> - \i Matches exactly \e n occurrences of the expression. This - is the same as repeating the expression \e n times. For - example, <b>x{5}</b> is the same as <b>xxxxx</b>. It is also - the same as <b>\e {E}{n,n}</b>, e.g. <b>x{5,5}</b>. - - \row \i <b>\e {E}{n,}</b> - \i Matches at least \e n occurrences of the expression. This - is the same as <b>\e {E}{n,MAXINT}</b>. - - \row \i <b>\e {E}{,m}</b> - \i Matches at most \e m occurrences of the expression. This - is the same as <b>\e {E}{0,m}</b>. - - \row \i <b>\e {E}{n,m}</b> - \i Matches at least \e n occurrences of the expression and at - most \e m occurrences of the expression. - \endtable - - (MAXINT is implementation dependent but will not be smaller than - 1024.) - - If we wish to apply a quantifier to more than just the preceding - character we can use parentheses to group characters together in - an expression. For example, <b>tag+</b> matches a 't' followed by - an 'a' followed by at least one 'g', whereas <b>(tag)+</b> matches - at least one occurrence of 'tag'. - - Note that quantifiers are "greedy". They will match as much text - as they can. For example, <b>0+</b> will match as many zeros as it - can from the first zero it finds, e.g. '2.<u>000</u>5'. - Quantifiers can be made non-greedy, see setMinimal(). - - \target capturing-text - \section1 Capturing Text - - Parentheses allow us to group elements together so that we can - quantify and capture them. For example if we have the expression - <b>mail|letter|correspondence</b> that matches a string we know - that \e one of the words matched but not which one. Using - parentheses allows us to "capture" whatever is matched within - their bounds, so if we used <b>(mail|letter|correspondence)</b> - and matched this regexp against the string "I sent you some email" - we can use the cap() or capturedTexts() functions to extract the - matched characters, in this case 'mail'. - - We can use captured text within the regexp itself. To refer to the - captured text we use \e backreferences which are indexed from 1, - the same as for cap(). For example we could search for duplicate - words in a string using <b>\b(\w+)\W+\1\b</b> which means match a - word boundary followed by one or more word characters followed by - one or more non-word characters followed by the same text as the - first parenthesised expression followed by a word boundary. - - If we want to use parentheses purely for grouping and not for - capturing we can use the non-capturing syntax, e.g. - <b>(?:green|blue)</b>. Non-capturing parentheses begin '(?:' and - end ')'. In this example we match either 'green' or 'blue' but we - do not capture the match so we only know whether or not we matched - but not which color we actually found. Using non-capturing - parentheses is more efficient than using capturing parentheses - since the regexp engine has to do less book-keeping. - - Both capturing and non-capturing parentheses may be nested. - - \target assertions - \section1 Assertions - - Assertions make some statement about the text at the point where - they occur in the regexp but they do not match any characters. In - the following list <b>\e {E}</b> stands for any expression. - - \table - \row \i <b>^</b> - \i The caret signifies the beginning of the string. If you - wish to match a literal \c{^} you must escape it by - writing <b>\^</b>. For example, <b>^#include</b> will only - match strings which \e begin with the characters '#include'. - (When the caret is the first character of a character set it - has a special meaning, see \link #sets-of-characters Sets of - Characters \endlink.) - - \row \i <b>$</b> - \i The dollar signifies the end of the string. For example - <b>\d\s*$</b> will match strings which end with a digit - optionally followed by whitespace. If you wish to match a - literal \c{$} you must escape it by writing - <b>\$</b>. - - \row \i <b>\\b</b> - \i A word boundary. For example the regexp - <b>\\bOK\\b</b> means match immediately after a word - boundary (e.g. start of string or whitespace) the letter 'O' - then the letter 'K' immediately before another word boundary - (e.g. end of string or whitespace). But note that the - assertion does not actually match any whitespace so if we - write <b>(\\bOK\\b)</b> and we have a match it will only - contain 'OK' even if the string is "Its <u>OK</u> now". - - \row \i <b>\\B</b> - \i A non-word boundary. This assertion is true wherever - <b>\\b</b> is false. For example if we searched for - <b>\\Bon\\B</b> in "Left on" the match would fail (space - and end of string aren't non-word boundaries), but it would - match in "t<u>on</u>ne". - - \row \i <b>(?=\e E)</b> - \i Positive lookahead. This assertion is true if the - expression matches at this point in the regexp. For example, - <b>const(?=\\s+char)</b> matches 'const' whenever it is - followed by 'char', as in 'static <u>const</u> char *'. - (Compare with <b>const\\s+char</b>, which matches 'static - <u>const char</u> *'.) - - \row \i <b>(?!\e E)</b> - \i Negative lookahead. This assertion is true if the - expression does not match at this point in the regexp. For - example, <b>const(?!\\s+char)</b> matches 'const' \e except - when it is followed by 'char'. - \endtable - - \target wildcard-matching - \section1 Wildcard Matching (globbing) - - Most command shells such as \e bash or \e cmd.exe support "file - globbing", the ability to identify a group of files by using - wildcards. The setWildcard() function is used to switch between - regexp and wildcard mode. Wildcard matching is much simpler than - full regexps and has only four features: - - \table - \row \i <b>c</b> - \i Any character represents itself apart from those mentioned - below. Thus <b>c</b> matches the character \e c. - \row \i <b>?</b> - \i This matches any single character. It is the same as - <b>.</b> in full regexps. - \row \i <b>*</b> - \i This matches zero or more of any characters. It is the - same as <b>.*</b> in full regexps. - \row \i <b>[...]</b> - \i Sets of characters can be represented in square brackets, - similar to full regexps. Within the character class, like - outside, backslash has no special meaning. - \endtable - - For example if we are in wildcard mode and have strings which - contain filenames we could identify HTML files with <b>*.html</b>. - This will match zero or more characters followed by a dot followed - by 'h', 't', 'm' and 'l'. - - \target perl-users - \section1 Notes for Perl Users - - Most of the character class abbreviations supported by Perl are - supported by TQRegExp, see \link - #characters-and-abbreviations-for-sets-of-characters characters - and abbreviations for sets of characters \endlink. - - In TQRegExp, apart from within character classes, \c{^} always - signifies the start of the string, so carets must always be - escaped unless used for that purpose. In Perl the meaning of caret - varies automagically depending on where it occurs so escaping it - is rarely necessary. The same applies to \c{$} which in - TQRegExp always signifies the end of the string. - - TQRegExp's quantifiers are the same as Perl's greedy quantifiers. - Non-greedy matching cannot be applied to individual quantifiers, - but can be applied to all the quantifiers in the pattern. For - example, to match the Perl regexp <b>ro+?m</b> requires: - \code - TQRegExp rx( "ro+m" ); - rx.setMinimal( TRUE ); - \endcode - - The equivalent of Perl's \c{/i} option is - setCaseSensitive(FALSE). - - Perl's \c{/g} option can be emulated using a \link - #cap_in_a_loop loop \endlink. - - In TQRegExp <b>.</b> matches any character, therefore all TQRegExp - regexps have the equivalent of Perl's \c{/s} option. TQRegExp - does not have an equivalent to Perl's \c{/m} option, but this - can be emulated in various ways for example by splitting the input - into lines or by looping with a regexp that searches for newlines. - - Because TQRegExp is string oriented there are no \A, \Z or \z - assertions. The \G assertion is not supported but can be emulated - in a loop. - - Perl's $& is cap(0) or capturedTexts()[0]. There are no TQRegExp - equivalents for $`, $' or $+. Perl's capturing variables, $1, $2, - ... correspond to cap(1) or capturedTexts()[1], cap(2) or - capturedTexts()[2], etc. - - To substitute a pattern use TQString::replace(). - - Perl's extended \c{/x} syntax is not supported, nor are - directives, e.g. (?i), or regexp comments, e.g. (?#comment). On - the other hand, C++'s rules for literal strings can be used to - achieve the same: - \code - TQRegExp mark( "\\b" // word boundary - "[Mm]ark" // the word we want to match - ); - \endcode - - Both zero-width positive and zero-width negative lookahead - assertions (?=pattern) and (?!pattern) are supported with the same - syntax as Perl. Perl's lookbehind assertions, "independent" - subexpressions and conditional expressions are not supported. - - Non-capturing parentheses are also supported, with the same - (?:pattern) syntax. - - See TQStringList::split() and TQStringList::join() for equivalents - to Perl's split and join functions. - - Note: because C++ transforms \\'s they must be written \e twice in - code, e.g. <b>\\b</b> must be written <b>\\\\b</b>. - - \target code-examples - \section1 Code Examples - - \code - TQRegExp rx( "^\\d\\d?$" ); // match integers 0 to 99 - rx.search( "123" ); // returns -1 (no match) - rx.search( "-6" ); // returns -1 (no match) - rx.search( "6" ); // returns 0 (matched as position 0) - \endcode - - The third string matches '<u>6</u>'. This is a simple validation - regexp for integers in the range 0 to 99. - - \code - TQRegExp rx( "^\\S+$" ); // match strings without whitespace - rx.search( "Hello world" ); // returns -1 (no match) - rx.search( "This_is-OK" ); // returns 0 (matched at position 0) - \endcode - - The second string matches '<u>This_is-OK</u>'. We've used the - character set abbreviation '\S' (non-whitespace) and the anchors - to match strings which contain no whitespace. - - In the following example we match strings containing 'mail' or - 'letter' or 'correspondence' but only match whole words i.e. not - 'email' - - \code - TQRegExp rx( "\\b(mail|letter|correspondence)\\b" ); - rx.search( "I sent you an email" ); // returns -1 (no match) - rx.search( "Please write the letter" ); // returns 17 - \endcode - - The second string matches "Please write the <u>letter</u>". The - word 'letter' is also captured (because of the parentheses). We - can see what text we've captured like this: - - \code - TQString captured = rx.cap( 1 ); // captured == "letter" - \endcode - - This will capture the text from the first set of capturing - parentheses (counting capturing left parentheses from left to - right). The parentheses are counted from 1 since cap( 0 ) is the - whole matched regexp (equivalent to '&' in most regexp engines). - - \code - TQRegExp rx( "&(?!amp;)" ); // match ampersands but not & - TQString line1 = "This & that"; - line1.replace( rx, "&" ); - // line1 == "This & that" - TQString line2 = "His & hers & theirs"; - line2.replace( rx, "&" ); - // line2 == "His & hers & theirs" - \endcode - - Here we've passed the TQRegExp to TQString's replace() function to - replace the matched text with new text. - - \code - TQString str = "One Eric another Eirik, and an Ericsson." - " How many Eiriks, Eric?"; - TQRegExp rx( "\\b(Eric|Eirik)\\b" ); // match Eric or Eirik - int pos = 0; // where we are in the string - int count = 0; // how many Eric and Eirik's we've counted - while ( pos >= 0 ) { - pos = rx.search( str, pos ); - if ( pos >= 0 ) { - pos++; // move along in str - count++; // count our Eric or Eirik - } - } - \endcode - - We've used the search() function to repeatedly match the regexp in - the string. Note that instead of moving forward by one character - at a time \c pos++ we could have written \c {pos += - rx.matchedLength()} to skip over the already matched string. The - count will equal 3, matching 'One <u>Eric</u> another - <u>Eirik</u>, and an Ericsson. How many Eiriks, <u>Eric</u>?'; it - doesn't match 'Ericsson' or 'Eiriks' because they are not bounded - by non-word boundaries. - - One common use of regexps is to split lines of delimited data into - their component fields. - - \code - str = "Trolltech AS\twww.trolltech.com\tNorway"; - TQString company, web, country; - rx.setPattern( "^([^\t]+)\t([^\t]+)\t([^\t]+)$" ); - if ( rx.search( str ) != -1 ) { - company = rx.cap( 1 ); - web = rx.cap( 2 ); - country = rx.cap( 3 ); - } - \endcode - - In this example our input lines have the format company name, web - address and country. Unfortunately the regexp is rather long and - not very versatile -- the code will break if we add any more - fields. A simpler and better solution is to look for the - separator, '\t' in this case, and take the surrounding text. The - TQStringList split() function can take a separator string or regexp - as an argument and split a string accordingly. - - \code - TQStringList field = TQStringList::split( "\t", str ); - \endcode - - Here field[0] is the company, field[1] the web address and so on. - - To imitate the matching of a shell we can use wildcard mode. - - \code - TQRegExp rx( "*.html" ); // invalid regexp: * doesn't quantify anything - rx.setWildcard( TRUE ); // now it's a valid wildcard regexp - rx.exactMatch( "index.html" ); // returns TRUE - rx.exactMatch( "default.htm" ); // returns FALSE - rx.exactMatch( "readme.txt" ); // returns FALSE - \endcode - - Wildcard matching can be convenient because of its simplicity, but - any wildcard regexp can be defined using full regexps, e.g. - <b>.*\.html$</b>. Notice that we can't match both \c .html and \c - .htm files with a wildcard unless we use <b>*.htm*</b> which will - also match 'test.html.bak'. A full regexp gives us the precision - we need, <b>.*\\.html?$</b>. - - TQRegExp can match case insensitively using setCaseSensitive(), and - can use non-greedy matching, see setMinimal(). By default TQRegExp - uses full regexps but this can be changed with setWildcard(). - Searching can be forward with search() or backward with - searchRev(). Captured text can be accessed using capturedTexts() - which returns a string list of all captured strings, or using - cap() which returns the captured string for the given index. The - pos() function takes a match index and returns the position in the - string where the match was made (or -1 if there was no match). - - \sa TQRegExpValidator TQString TQStringList - - \target member-function-documentation -*/ - -const int NumBadChars = 64; -#define BadChar( ch ) ( (ch).tqunicode() % NumBadChars ) - -const int NoOccurrence = INT_MAX; -const int EmptyCapture = INT_MAX; -const int InftyLen = INT_MAX; -const int InftyRep = 1025; -const int EOS = -1; - -static bool isWord( TQChar ch ) -{ - return ch.isLetterOrNumber() || ch == TQChar( '_' ); -} - -/* - Merges two TQMemArrays of ints and puts the result into the first - one. -*/ -static void mergeInto( TQMemArray<int> *a, const TQMemArray<int>& b ) -{ - int asize = a->size(); - int bsize = b.size(); - if ( asize == 0 ) { - *a = b.copy(); -#ifndef TQT_NO_REGEXP_OPTIM - } else if ( bsize == 1 && (*a)[asize - 1] < b[0] ) { - a->resize( asize + 1 ); - (*a)[asize] = b[0]; -#endif - } else if ( bsize >= 1 ) { - int csize = asize + bsize; - TQMemArray<int> c( csize ); - int i = 0, j = 0, k = 0; - while ( i < asize ) { - if ( j < bsize ) { - if ( (*a)[i] == b[j] ) { - i++; - csize--; - } else if ( (*a)[i] < b[j] ) { - c[k++] = (*a)[i++]; - } else { - c[k++] = b[j++]; - } - } else { - memcpy( c.data() + k, (*a).data() + i, - (asize - i) * sizeof(int) ); - break; - } - } - c.resize( csize ); - if ( j < bsize ) - memcpy( c.data() + k, b.data() + j, (bsize - j) * sizeof(int) ); - *a = c; - } -} - -/* - Merges two disjoint TQMaps of (int, int) pairs and puts the result - into the first one. -*/ -static void mergeInto( TQMap<int, int> *a, const TQMap<int, int>& b ) -{ - TQMap<int, int>::ConstIterator it; - for ( it = b.begin(); it != b.end(); ++it ) - a->insert( it.key(), *it ); -} - -/* - Returns the value associated to key k in TQMap m of (int, int) - pairs, or 0 if no such value is explicitly present. -*/ -static int at( const TQMap<int, int>& m, int k ) -{ - TQMap<int, int>::ConstIterator it = m.find( k ); - if ( it == m.end() ) - return 0; - else - return *it; -} - -#ifndef TQT_NO_REGEXP_WILDCARD -/* - Translates a wildcard pattern to an equivalent regular expression - pattern (e.g., *.cpp to .*\.cpp). -*/ -static TQString wc2rx( const TQString& wc_str ) -{ - int wclen = wc_str.length(); - TQString rx = TQString::tqfromLatin1( "" ); - int i = 0; - const TQChar *wc = wc_str.tqunicode(); - while ( i < wclen ) { - TQChar c = wc[i++]; - switch ( c.tqunicode() ) { - case '*': - rx += TQString::tqfromLatin1( ".*" ); - break; - case '?': - rx += TQChar( '.' ); - break; - case '$': - case '(': - case ')': - case '+': - case '.': - case '\\': - case '^': - case '{': - case '|': - case '}': - rx += TQChar( '\\' ); - rx += c; - break; - case '[': - rx += c; - if ( wc[i] == TQChar('^') ) - rx += wc[i++]; - if ( i < wclen ) { - if ( rx[i] == ']' ) - rx += wc[i++]; - while ( i < wclen && wc[i] != TQChar(']') ) { - if ( wc[i] == '\\' ) - rx += TQChar( '\\' ); - rx += wc[i++]; - } - } - break; - default: - rx += c; - } - } - return rx; -} -#endif - -/* - The class TQRegExpEngine encapsulates a modified nondeterministic - finite automaton (NFA). -*/ -class TQRegExpEngine : public TQShared -{ -public: -#ifndef TQT_NO_REGEXP_CCLASS - /* - The class CharClass represents a set of characters, such as can - be found in regular expressions (e.g., [a-z] denotes the set - {a, b, ..., z}). - */ - class CharClass - { - public: - CharClass(); - CharClass( const CharClass& cc ) { operator=( cc ); } - - CharClass& operator=( const CharClass& cc ); - - void clear(); - bool negative() const { return n; } - void setNegative( bool negative ); - void addCategories( int cats ); - void addRange( ushort from, ushort to ); - void addSingleton( ushort ch ) { addRange( ch, ch ); } - - bool in( TQChar ch ) const; -#ifndef TQT_NO_REGEXP_OPTIM - const TQMemArray<int>& firstOccurrence() const { return occ1; } -#endif - -#if defined(TQT_DEBUG) - void dump() const; -#endif - - private: - /* - The struct Range represents a range of characters (e.g., - [0-9] denotes range 48 to 57). - */ - struct Range - { - ushort from; // 48 - ushort to; // 57 - }; - - int c; // character classes - TQMemArray<Range> r; // character ranges - bool n; // negative? -#ifndef TQT_NO_REGEXP_OPTIM - TQMemArray<int> occ1; // first-occurrence array -#endif - }; -#else - struct CharClass - { - int dummy; - -#ifndef TQT_NO_REGEXP_OPTIM - CharClass() { occ1.fill( 0, NumBadChars ); } - - const TQMemArray<int>& firstOccurrence() const { return occ1; } - TQMemArray<int> occ1; -#endif - }; -#endif - - TQRegExpEngine( bool caseSensitive ) { setup( caseSensitive ); } - TQRegExpEngine( const TQString& rx, bool caseSensitive ); -#ifndef TQT_NO_REGEXP_OPTIM - ~TQRegExpEngine(); -#endif - - bool isValid() const { return valid; } - bool caseSensitive() const { return cs; } - const TQString& errorString() const { return yyError; } - int numCaptures() const { return officialncap; } - void match( const TQString& str, int pos, bool minimal, bool oneTest, - int caretIndex, TQMemArray<int>& captured ); - int partialMatchLength() const { return mmOneTestMatchedLen; } - - int createState( TQChar ch ); - int createState( const CharClass& cc ); -#ifndef TQT_NO_REGEXP_BACKREF - int createState( int bref ); -#endif - - void addCatTransitions( const TQMemArray<int>& from, - const TQMemArray<int>& to ); -#ifndef TQT_NO_REGEXP_CAPTURE - void addPlusTransitions( const TQMemArray<int>& from, - const TQMemArray<int>& to, int atom ); -#endif - -#ifndef TQT_NO_REGEXP_ANCHOR_ALT - int anchorAlternation( int a, int b ); - int anchorConcatenation( int a, int b ); -#else - int anchorAlternation( int a, int b ) { return a & b; } - int anchorConcatenation( int a, int b ) { return a | b; } -#endif - void addAnchors( int from, int to, int a ); - -#ifndef TQT_NO_REGEXP_OPTIM - void heuristicallyChooseHeuristic(); -#endif - -#if defined(TQT_DEBUG) - void dump() const; -#endif - -private: - enum { CharClassBit = 0x10000, BackRefBit = 0x20000 }; - - /* - The struct State represents one state in a modified NFA. The - input characters matched are stored in the state instead of on - the transitions, something possible for an automaton - constructed from a regular expression. - */ - struct State - { -#ifndef TQT_NO_REGEXP_CAPTURE - int atom; // which atom does this state belong to? -#endif - int match; // what does it match? (see CharClassBit and BackRefBit) - TQMemArray<int> outs; // out-transitions - TQMap<int, int> *reenter; // atoms reentered when transiting out - TQMap<int, int> *anchors; // anchors met when transiting out - -#ifndef TQT_NO_REGEXP_CAPTURE - State( int a, int m ) - : atom( a ), match( m ), reenter( 0 ), anchors( 0 ) { } -#else - State( int m ) - : match( m ), reenter( 0 ), anchors( 0 ) { } -#endif - ~State() { delete reenter; delete anchors; } - }; - -#ifndef TQT_NO_REGEXP_LOOKAHEAD - /* - The struct Lookahead represents a lookahead a la Perl (e.g., - (?=foo) and (?!bar)). - */ - struct Lookahead - { - TQRegExpEngine *eng; // NFA representing the embedded regular expression - bool neg; // negative lookahead? - - Lookahead( TQRegExpEngine *eng0, bool neg0 ) - : eng( eng0 ), neg( neg0 ) { } - ~Lookahead() { delete eng; } - }; -#endif - -#ifndef TQT_NO_REGEXP_CAPTURE - /* - The struct Atom represents one node in the hierarchy of regular - expression atoms. - */ - struct Atom - { - int parent; // index of parent in array of atoms - int capture; // index of capture, from 1 to ncap - }; -#endif - -#ifndef TQT_NO_REGEXP_ANCHOR_ALT - /* - The struct AnchorAlternation represents a pair of anchors with - OR semantics. - */ - struct AnchorAlternation - { - int a; // this anchor... - int b; // ...or this one - }; -#endif - - enum { InitialState = 0, FinalState = 1 }; - void setup( bool caseSensitive ); - int setupState( int match ); - - /* - Let's hope that 13 lookaheads and 14 back-references are - enough. - */ - enum { MaxLookaheads = 13, MaxBackRefs = 14 }; - enum { Anchor_Dollar = 0x00000001, Anchor_Caret = 0x00000002, - Anchor_Word = 0x00000004, Anchor_NonWord = 0x00000008, - Anchor_FirstLookahead = 0x00000010, - Anchor_BackRef1Empty = Anchor_FirstLookahead << MaxLookaheads, - Anchor_BackRef0Empty = Anchor_BackRef1Empty >> 1, - Anchor_Alternation = Anchor_BackRef1Empty << MaxBackRefs, - - Anchor_LookaheadMask = ( Anchor_FirstLookahead - 1 ) ^ - ( (Anchor_FirstLookahead << MaxLookaheads) - 1 ) }; -#ifndef TQT_NO_REGEXP_CAPTURE - int startAtom( bool capture ); - void finishAtom( int atom ) { cf = f[atom].parent; } -#endif - -#ifndef TQT_NO_REGEXP_LOOKAHEAD - int addLookahead( TQRegExpEngine *eng, bool negative ); -#endif - -#ifndef TQT_NO_REGEXP_CAPTURE - bool isBetterCapture( const int *begin1, const int *end1, const int *begin2, - const int *end2 ); -#endif - bool testAnchor( int i, int a, const int *capBegin ); - -#ifndef TQT_NO_REGEXP_OPTIM - bool goodStringMatch(); - bool badCharMatch(); -#else - bool bruteMatch(); -#endif - bool matchHere(); - - TQPtrVector<State> s; // array of states - int ns; // number of states -#ifndef TQT_NO_REGEXP_CAPTURE - TQMemArray<Atom> f; // atom hierarchy - int nf; // number of atoms - int cf; // current atom -#endif - int officialncap; // number of captures, seen from the outside - int ncap; // number of captures, seen from the inside -#ifndef TQT_NO_REGEXP_CCLASS - TQPtrVector<CharClass> cl; // array of character classes -#endif -#ifndef TQT_NO_REGEXP_LOOKAHEAD - TQPtrVector<Lookahead> ahead; // array of lookaheads -#endif -#ifndef TQT_NO_REGEXP_ANCHOR_ALT - TQMemArray<AnchorAlternation> aa; // array of (a, b) pairs of anchors -#endif -#ifndef TQT_NO_REGEXP_OPTIM - bool caretAnchored; // does the regexp start with ^? - bool trivial; // is the good-string all that needs to match? -#endif - bool valid; // is the regular expression valid? - bool cs; // case sensitive? -#ifndef TQT_NO_REGEXP_BACKREF - int nbrefs; // number of back-references -#endif - -#ifndef TQT_NO_REGEXP_OPTIM - bool useGoodStringHeuristic; // use goodStringMatch? otherwise badCharMatch - - int goodEarlyStart; // the index where goodStr can first occur in a match - int goodLateStart; // the index where goodStr can last occur in a match - TQString goodStr; // the string that any match has to contain - - int minl; // the minimum length of a match - TQMemArray<int> occ1; // first-occurrence array -#endif - - /* - The class Box is an abstraction for a regular expression - fragment. It can also be seen as one node in the syntax tree of - a regular expression with synthetized attributes. - - Its interface is ugly for performance reasons. - */ - class Box - { - public: - Box( TQRegExpEngine *engine ); - Box( const Box& b ) { operator=( b ); } - - Box& operator=( const Box& b ); - - void clear() { operator=( Box(eng) ); } - void set( TQChar ch ); - void set( const CharClass& cc ); -#ifndef TQT_NO_REGEXP_BACKREF - void set( int bref ); -#endif - - void cat( const Box& b ); - void orx( const Box& b ); - void plus( int atom ); - void opt(); - void catAnchor( int a ); -#ifndef TQT_NO_REGEXP_OPTIM - void setupHeuristics(); -#endif - -#if defined(TQT_DEBUG) - void dump() const; -#endif - - private: - void addAnchorsToEngine( const Box& to ) const; - - TQRegExpEngine *eng; // the automaton under construction - TQMemArray<int> ls; // the left states (firstpos) - TQMemArray<int> rs; // the right states (lastpos) - TQMap<int, int> lanchors; // the left anchors - TQMap<int, int> ranchors; // the right anchors - int skipanchors; // the anchors to match if the box is skipped - -#ifndef TQT_NO_REGEXP_OPTIM - int earlyStart; // the index where str can first occur - int lateStart; // the index where str can last occur - TQString str; // a string that has to occur in any match - TQString leftStr; // a string occurring at the left of this box - TQString rightStr; // a string occurring at the right of this box - int maxl; // the maximum length of this box (possibly InftyLen) -#endif - - int minl; // the minimum length of this box -#ifndef TQT_NO_REGEXP_OPTIM - TQMemArray<int> occ1; // first-occurrence array -#endif - }; - friend class Box; - - /* - This is the lexical analyzer for regular expressions. - */ - enum { Tok_Eos, Tok_Dollar, Tok_LeftParen, Tok_MagicLeftParen, - Tok_PosLookahead, Tok_NegLookahead, Tok_RightParen, Tok_CharClass, - Tok_Caret, Tok_Quantifier, Tok_Bar, Tok_Word, Tok_NonWord, - Tok_Char = 0x10000, Tok_BackRef = 0x20000 }; - int getChar(); - int getEscape(); -#ifndef TQT_NO_REGEXP_INTERVAL - int getRep( int def ); -#endif -#ifndef TQT_NO_REGEXP_LOOKAHEAD - void skipChars( int n ); -#endif - void error( const char *msg ); - void startTokenizer( const TQChar *rx, int len ); - int getToken(); - - const TQChar *yyIn; // a pointer to the input regular expression pattern - int yyPos0; // the position of yyTok in the input pattern - int yyPos; // the position of the next character to read - int yyLen; // the length of yyIn - int yyCh; // the last character read - CharClass *yyCharClass; // attribute for Tok_CharClass tokens - int yyMinRep; // attribute for Tok_Quantifier - int yyMaxRep; // ditto - TQString yyError; // syntax error or overflow during parsing? - - /* - This is the syntactic analyzer for regular expressions. - */ - int parse( const TQChar *rx, int len ); - void parseAtom( Box *box ); - void parseFactor( Box *box ); - void parseTerm( Box *box ); - void parseExpression( Box *box ); - - int yyTok; // the last token read - bool yyMayCapture; // set this to FALSE to disable capturing - - /* - This is the engine state during matching. - */ - const TQString *mmStr; // a pointer to the input TQString - const TQChar *mmIn; // a pointer to the input string data - int mmPos; // the current position in the string - int mmCaretPos; - int mmLen; // the length of the input string - bool mmMinimal; // minimal matching? - TQMemArray<int> mmBigArray; // big TQMemArray<int> array - int *mmInNextStack; // is state is mmNextStack? - int *mmCurStack; // stack of current states - int *mmNextStack; // stack of next states - int *mmCurCapBegin; // start of current states' captures - int *mmNextCapBegin; // start of next states' captures - int *mmCurCapEnd; // end of current states' captures - int *mmNextCapEnd; // end of next states' captures - int *mmTempCapBegin; // start of temporary captures - int *mmTempCapEnd; // end of temporary captures - int *mmCapBegin; // start of captures for a next state - int *mmCapEnd; // end of captures for a next state - int *mmSlideTab; // bump-along slide table for bad-character heuristic - int mmSlideTabSize; // size of slide table -#ifndef TQT_NO_REGEXP_BACKREF - TQIntDict<int> mmSleeping; // dictionary of back-reference sleepers -#endif - int mmMatchLen; // length of match - int mmOneTestMatchedLen; // length of partial match -}; - -TQRegExpEngine::TQRegExpEngine( const TQString& rx, bool caseSensitive ) -#ifndef TQT_NO_REGEXP_BACKREF - : mmSleeping( 101 ) -#endif -{ - setup( caseSensitive ); - valid = ( parse(rx.tqunicode(), rx.length()) == (int) rx.length() ); - if ( !valid ) { -#ifndef TQT_NO_REGEXP_OPTIM - trivial = FALSE; -#endif - error( RXERR_LEFTDELIM ); - } -} - -#ifndef TQT_NO_REGEXP_OPTIM -TQRegExpEngine::~TQRegExpEngine() -{ -} -#endif - -/* - Tries to match in str and returns an array of (begin, length) pairs - for captured text. If there is no match, all pairs are (-1, -1). -*/ -void TQRegExpEngine::match( const TQString& str, int pos, bool minimal, - bool oneTest, int caretIndex, - TQMemArray<int>& captured ) -{ - bool matched = FALSE; - -#ifndef TQT_NO_REGEXP_OPTIM - if ( trivial && !oneTest ) { - mmPos = str.find( goodStr, pos, cs ); - mmMatchLen = goodStr.length(); - matched = ( mmPos != -1 ); - } else -#endif - { - mmStr = &str; - mmIn = str.tqunicode(); - if ( mmIn == 0 ) - mmIn = &TQChar::null; - mmPos = pos; - mmCaretPos = caretIndex; - mmLen = str.length(); - mmMinimal = minimal; - mmMatchLen = 0; - mmOneTestMatchedLen = 0; - - if ( valid && mmPos >= 0 && mmPos <= mmLen ) { -#ifndef TQT_NO_REGEXP_OPTIM - if ( oneTest ) { - matched = matchHere(); - } else { - if ( mmPos <= mmLen - minl ) { - if ( caretAnchored ) { - matched = matchHere(); - } else if ( useGoodStringHeuristic ) { - matched = goodStringMatch(); - } else { - matched = badCharMatch(); - } - } - } -#else - matched = oneTest ? matchHere() : bruteMatch(); -#endif - } - } - - int capturedSize = 2 + 2 * officialncap; - captured.detach(); - captured.resize( capturedSize ); - if ( matched ) { - captured[0] = mmPos; - captured[1] = mmMatchLen; - for ( int j = 0; j < officialncap; j++ ) { - int len = mmCapEnd[j] - mmCapBegin[j]; - captured[2 + 2 * j] = len > 0 ? mmPos + mmCapBegin[j] : 0; - captured[2 + 2 * j + 1] = len; - } - } else { - // we rely on 2's complement here - memset( captured.data(), -1, capturedSize * sizeof(int) ); - } -} - -/* - The three following functions add one state to the automaton and - return the number of the state. -*/ - -int TQRegExpEngine::createState( TQChar ch ) -{ - return setupState( ch.tqunicode() ); -} - -int TQRegExpEngine::createState( const CharClass& cc ) -{ -#ifndef TQT_NO_REGEXP_CCLASS - int n = cl.size(); - cl.resize( n + 1 ); - cl.insert( n, new CharClass(cc) ); - return setupState( CharClassBit | n ); -#else - TQ_UNUSED( cc ); - return setupState( CharClassBit ); -#endif -} - -#ifndef TQT_NO_REGEXP_BACKREF -int TQRegExpEngine::createState( int bref ) -{ - if ( bref > nbrefs ) { - nbrefs = bref; - if ( nbrefs > MaxBackRefs ) { - error( RXERR_LIMIT ); - return 0; - } - } - return setupState( BackRefBit | bref ); -} -#endif - -/* - The two following functions add a transition between all pairs of - states (i, j) where i is fond in from, and j is found in to. - - Cat-transitions are distinguished from plus-transitions for - capturing. -*/ - -void TQRegExpEngine::addCatTransitions( const TQMemArray<int>& from, - const TQMemArray<int>& to ) -{ - for ( int i = 0; i < (int) from.size(); i++ ) { - State *st = s[from[i]]; - mergeInto( &st->outs, to ); - } -} - -#ifndef TQT_NO_REGEXP_CAPTURE -void TQRegExpEngine::addPlusTransitions( const TQMemArray<int>& from, - const TQMemArray<int>& to, int atom ) -{ - for ( int i = 0; i < (int) from.size(); i++ ) { - State *st = s[from[i]]; - TQMemArray<int> oldOuts = st->outs.copy(); - mergeInto( &st->outs, to ); - if ( f[atom].capture >= 0 ) { - if ( st->reenter == 0 ) - st->reenter = new TQMap<int, int>; - for ( int j = 0; j < (int) to.size(); j++ ) { - if ( !st->reenter->contains(to[j]) && - oldOuts.bsearch(to[j]) < 0 ) - st->reenter->insert( to[j], atom ); - } - } - } -} -#endif - -#ifndef TQT_NO_REGEXP_ANCHOR_ALT -/* - Returns an anchor that means a OR b. -*/ -int TQRegExpEngine::anchorAlternation( int a, int b ) -{ - if ( ((a & b) == a || (a & b) == b) && ((a | b) & Anchor_Alternation) == 0 ) - return a & b; - - int n = aa.size(); -#ifndef TQT_NO_REGEXP_OPTIM - if ( n > 0 && aa[n - 1].a == a && aa[n - 1].b == b ) - return Anchor_Alternation | ( n - 1 ); -#endif - - aa.resize( n + 1 ); - aa[n].a = a; - aa[n].b = b; - return Anchor_Alternation | n; -} - -/* - Returns an anchor that means a AND b. -*/ -int TQRegExpEngine::anchorConcatenation( int a, int b ) -{ - if ( ((a | b) & Anchor_Alternation) == 0 ) - return a | b; - if ( (b & Anchor_Alternation) != 0 ) - tqSwap( a, b ); - - int aprime = anchorConcatenation( aa[a ^ Anchor_Alternation].a, b ); - int bprime = anchorConcatenation( aa[a ^ Anchor_Alternation].b, b ); - return anchorAlternation( aprime, bprime ); -} -#endif - -/* - Adds anchor a on a transition caracterised by its from state and - its to state. -*/ -void TQRegExpEngine::addAnchors( int from, int to, int a ) -{ - State *st = s[from]; - if ( st->anchors == 0 ) - st->anchors = new TQMap<int, int>; - if ( st->anchors->contains(to) ) - a = anchorAlternation( (*st->anchors)[to], a ); - st->anchors->insert( to, a ); -} - -#ifndef TQT_NO_REGEXP_OPTIM -/* - This function chooses between the good-string and the bad-character - heuristics. It computes two scores and chooses the heuristic with - the highest score. - - Here are some common-sense constraints on the scores that should be - respected if the formulas are ever modified: (1) If goodStr is - empty, the good-string heuristic scores 0. (2) If the regular - expression is trivial, the good-string heuristic should be used. - (3) If the search is case insensitive, the good-string heuristic - should be used, unless it scores 0. (Case insensitivity turns all - entries of occ1 to 0.) (4) If (goodLateStart - goodEarlyStart) is - big, the good-string heuristic should score less. -*/ -void TQRegExpEngine::heuristicallyChooseHeuristic() -{ - if ( minl == 0 ) { - useGoodStringHeuristic = FALSE; - } else if ( trivial ) { - useGoodStringHeuristic = TRUE; - } else { - /* - Magic formula: The good string has to constitute a good - proportion of the minimum-length string, and appear at a - more-or-less known index. - */ - int goodStringScore = ( 64 * goodStr.length() / minl ) - - ( goodLateStart - goodEarlyStart ); - /* - Less magic formula: We pick some characters at random, and - check whether they are good or bad. - */ - int badCharScore = 0; - int step = TQMAX( 1, NumBadChars / 32 ); - for ( int i = 1; i < NumBadChars; i += step ) { - if ( occ1[i] == NoOccurrence ) - badCharScore += minl; - else - badCharScore += occ1[i]; - } - badCharScore /= minl; - useGoodStringHeuristic = ( goodStringScore > badCharScore ); - } -} -#endif - -#if defined(TQT_DEBUG) -void TQRegExpEngine::dump() const -{ - int i, j; - qDebug( "Case %ssensitive engine", cs ? "" : "in" ); - qDebug( " States" ); - for ( i = 0; i < ns; i++ ) { - qDebug( " %d%s", i, - i == InitialState ? " (initial)" : - i == FinalState ? " (final)" : "" ); -#ifndef TQT_NO_REGEXP_CAPTURE - qDebug( " in atom %d", s[i]->atom ); -#endif - int m = s[i]->match; - if ( (m & CharClassBit) != 0 ) { - qDebug( " match character class %d", m ^ CharClassBit ); -#ifndef TQT_NO_REGEXP_CCLASS - cl[m ^ CharClassBit]->dump(); -#else - qDebug( " negative character class" ); -#endif - } else if ( (m & BackRefBit) != 0 ) { - qDebug( " match back-reference %d", m ^ BackRefBit ); - } else if ( m >= 0x20 && m <= 0x7e ) { - qDebug( " match 0x%.4x (%c)", m, m ); - } else { - qDebug( " match 0x%.4x", m ); - } - for ( j = 0; j < (int) s[i]->outs.size(); j++ ) { - int next = s[i]->outs[j]; - qDebug( " -> %d", next ); - if ( s[i]->reenter != 0 && s[i]->reenter->contains(next) ) - qDebug( " [reenter %d]", (*s[i]->reenter)[next] ); - if ( s[i]->anchors != 0 && at(*s[i]->anchors, next) != 0 ) - qDebug( " [anchors 0x%.8x]", (*s[i]->anchors)[next] ); - } - } -#ifndef TQT_NO_REGEXP_CAPTURE - if ( nf > 0 ) { - qDebug( " Atom Parent Capture" ); - for ( i = 0; i < nf; i++ ) - qDebug( " %6d %6d %6d", i, f[i].parent, f[i].capture ); - } -#endif -#ifndef TQT_NO_REGEXP_ANCHOR_ALT - for ( i = 0; i < (int) aa.size(); i++ ) - qDebug( " Anchor alternation 0x%.8x: 0x%.8x 0x%.9x", i, aa[i].a, - aa[i].b ); -#endif -} -#endif - -void TQRegExpEngine::setup( bool caseSensitive ) -{ - s.setAutoDelete( TRUE ); - s.resize( 32 ); - ns = 0; -#ifndef TQT_NO_REGEXP_CAPTURE - f.resize( 32 ); - nf = 0; - cf = -1; -#endif - officialncap = 0; - ncap = 0; -#ifndef TQT_NO_REGEXP_CCLASS - cl.setAutoDelete( TRUE ); -#endif -#ifndef TQT_NO_REGEXP_LOOKAHEAD - ahead.setAutoDelete( TRUE ); -#endif -#ifndef TQT_NO_REGEXP_OPTIM - caretAnchored = TRUE; - trivial = TRUE; -#endif - valid = FALSE; - cs = caseSensitive; -#ifndef TQT_NO_REGEXP_BACKREF - nbrefs = 0; -#endif -#ifndef TQT_NO_REGEXP_OPTIM - useGoodStringHeuristic = TRUE; - minl = 0; - occ1.fill( 0, NumBadChars ); -#endif -} - -int TQRegExpEngine::setupState( int match ) -{ - if ( (ns & (ns + 1)) == 0 && ns + 1 >= (int) s.size() ) - s.resize( (ns + 1) << 1 ); -#ifndef TQT_NO_REGEXP_CAPTURE - s.insert( ns, new State(cf, match) ); -#else - s.insert( ns, new State(match) ); -#endif - return ns++; -} - -#ifndef TQT_NO_REGEXP_CAPTURE -/* - Functions startAtom() and finishAtom() should be called to delimit - atoms. When a state is created, it is assigned to the current atom. - The information is later used for capturing. -*/ -int TQRegExpEngine::startAtom( bool capture ) -{ - if ( (nf & (nf + 1)) == 0 && nf + 1 >= (int) f.size() ) - f.resize( (nf + 1) << 1 ); - f[nf].parent = cf; - cf = nf++; - f[cf].capture = capture ? ncap++ : -1; - return cf; -} -#endif - -#ifndef TQT_NO_REGEXP_LOOKAHEAD -/* - Creates a lookahead anchor. -*/ -int TQRegExpEngine::addLookahead( TQRegExpEngine *eng, bool negative ) -{ - int n = ahead.size(); - if ( n == MaxLookaheads ) { - error( RXERR_LIMIT ); - return 0; - } - ahead.resize( n + 1 ); - ahead.insert( n, new Lookahead(eng, negative) ); - return Anchor_FirstLookahead << n; -} -#endif - -#ifndef TQT_NO_REGEXP_CAPTURE -/* - We want the longest leftmost captures. -*/ -bool TQRegExpEngine::isBetterCapture( const int *begin1, const int *end1, - const int *begin2, const int *end2 ) -{ - for ( int i = 0; i < ncap; i++ ) { - int delta = begin2[i] - begin1[i]; // it has to start early... - if ( delta == 0 ) - delta = end1[i] - end2[i]; // ...and end late (like a party) - - if ( delta != 0 ) - return delta > 0; - } - return FALSE; -} -#endif - -/* - Returns TRUE if anchor a matches at position mmPos + i in the input - string, otherwise FALSE. -*/ -bool TQRegExpEngine::testAnchor( int i, int a, const int *capBegin ) -{ - int j; - -#ifndef TQT_NO_REGEXP_ANCHOR_ALT - if ( (a & Anchor_Alternation) != 0 ) { - return testAnchor( i, aa[a ^ Anchor_Alternation].a, capBegin ) || - testAnchor( i, aa[a ^ Anchor_Alternation].b, capBegin ); - } -#endif - - if ( (a & Anchor_Caret) != 0 ) { - if ( mmPos + i != mmCaretPos ) - return FALSE; - } - if ( (a & Anchor_Dollar) != 0 ) { - if ( mmPos + i != mmLen ) - return FALSE; - } -#ifndef TQT_NO_REGEXP_ESCAPE - if ( (a & (Anchor_Word | Anchor_NonWord)) != 0 ) { - bool before = FALSE; - bool after = FALSE; - if ( mmPos + i != 0 ) - before = isWord( mmIn[mmPos + i - 1] ); - if ( mmPos + i != mmLen ) - after = isWord( mmIn[mmPos + i] ); - if ( (a & Anchor_Word) != 0 && (before == after) ) - return FALSE; - if ( (a & Anchor_NonWord) != 0 && (before != after) ) - return FALSE; - } -#endif -#ifndef TQT_NO_REGEXP_LOOKAHEAD - if ( (a & Anchor_LookaheadMask) != 0 ) { - TQConstString cstr = TQConstString( (TQChar *) mmIn + mmPos + i, - mmLen - mmPos - i ); - for ( j = 0; j < (int) ahead.size(); j++ ) { - if ( (a & (Anchor_FirstLookahead << j)) != 0 ) { - TQMemArray<int> captured; - ahead[j]->eng->match( cstr.string(), 0, TRUE, TRUE, - mmCaretPos - mmPos - i, captured ); - if ( (captured[0] == 0) == ahead[j]->neg ) - return FALSE; - } - } - } -#endif -#ifndef TQT_NO_REGEXP_CAPTURE -#ifndef TQT_NO_REGEXP_BACKREF - for ( j = 0; j < nbrefs; j++ ) { - if ( (a & (Anchor_BackRef1Empty << j)) != 0 ) { - if ( capBegin[j] != EmptyCapture ) - return FALSE; - } - } -#endif -#endif - return TRUE; -} - -#ifndef TQT_NO_REGEXP_OPTIM -/* - The three following functions are what Jeffrey Friedl would call - transmissions (or bump-alongs). Using one or the other should make - no difference except in performance. -*/ - -bool TQRegExpEngine::goodStringMatch() -{ - int k = mmPos + goodEarlyStart; - while ( (k = mmStr->find(goodStr, k, cs)) != -1 ) { - int from = k - goodLateStart; - int to = k - goodEarlyStart; - if ( from > mmPos ) - mmPos = from; - - while ( mmPos <= to ) { - if ( matchHere() ) - return TRUE; - mmPos++; - } - k++; - } - return FALSE; -} - -bool TQRegExpEngine::badCharMatch() -{ - int slideHead = 0; - int slideNext = 0; - int i; - int lastPos = mmLen - minl; - memset( mmSlideTab, 0, mmSlideTabSize * sizeof(int) ); - - /* - Set up the slide table, used for the bad-character heuristic, - using the table of first occurrence of each character. - */ - for ( i = 0; i < minl; i++ ) { - int sk = occ1[BadChar(mmIn[mmPos + i])]; - if ( sk == NoOccurrence ) - sk = i + 1; - if ( sk > 0 ) { - int k = i + 1 - sk; - if ( k < 0 ) { - sk = i + 1; - k = 0; - } - if ( sk > mmSlideTab[k] ) - mmSlideTab[k] = sk; - } - } - - if ( mmPos > lastPos ) - return FALSE; - - for ( ;; ) { - if ( ++slideNext >= mmSlideTabSize ) - slideNext = 0; - if ( mmSlideTab[slideHead] > 0 ) { - if ( mmSlideTab[slideHead] - 1 > mmSlideTab[slideNext] ) - mmSlideTab[slideNext] = mmSlideTab[slideHead] - 1; - mmSlideTab[slideHead] = 0; - } else { - if ( matchHere() ) - return TRUE; - } - - if ( mmPos == lastPos ) - break; - - /* - Update the slide table. This code has much in common with - the initialization code. - */ - int sk = occ1[BadChar(mmIn[mmPos + minl])]; - if ( sk == NoOccurrence ) { - mmSlideTab[slideNext] = minl; - } else if ( sk > 0 ) { - int k = slideNext + minl - sk; - if ( k >= mmSlideTabSize ) - k -= mmSlideTabSize; - if ( sk > mmSlideTab[k] ) - mmSlideTab[k] = sk; - } - slideHead = slideNext; - mmPos++; - } - return FALSE; -} -#else -bool TQRegExpEngine::bruteMatch() -{ - while ( mmPos <= mmLen ) { - if ( matchHere() ) - return TRUE; - mmPos++; - } - return FALSE; -} -#endif - -/* - Here's the core of the engine. It tries to do a match here and now. -*/ -bool TQRegExpEngine::matchHere() -{ - int ncur = 1, nnext = 0; - int i = 0, j, k, m; - bool stop = FALSE; - - mmMatchLen = -1; - mmOneTestMatchedLen = -1; - mmCurStack[0] = InitialState; - -#ifndef TQT_NO_REGEXP_CAPTURE - if ( ncap > 0 ) { - for ( j = 0; j < ncap; j++ ) { - mmCurCapBegin[j] = EmptyCapture; - mmCurCapEnd[j] = EmptyCapture; - } - } -#endif - -#ifndef TQT_NO_REGEXP_BACKREF - int *zzZ = 0; - - while ( (ncur > 0 || !mmSleeping.isEmpty()) && i <= mmLen - mmPos && - !stop ) -#else - while ( ncur > 0 && i <= mmLen - mmPos && !stop ) -#endif - { - int ch = ( i < mmLen - mmPos ) ? mmIn[mmPos + i].tqunicode() : 0; - for ( j = 0; j < ncur; j++ ) { - int cur = mmCurStack[j]; - State *scur = s[cur]; - TQMemArray<int>& outs = scur->outs; - for ( k = 0; k < (int) outs.size(); k++ ) { - int next = outs[k]; - State *snext = s[next]; - bool in = TRUE; -#ifndef TQT_NO_REGEXP_BACKREF - int needSomeSleep = 0; -#endif - - /* - First, check if the anchors are anchored properly. - */ - if ( scur->anchors != 0 ) { - int a = at( *scur->anchors, next ); - if ( a != 0 && !testAnchor(i, a, mmCurCapBegin + j * ncap) ) - in = FALSE; - } - /* - If indeed they are, check if the input character is - correct for this transition. - */ - if ( in ) { - m = snext->match; - if ( (m & (CharClassBit | BackRefBit)) == 0 ) { - if ( cs ) - in = ( m == ch ); - else - in = ( TQChar(m).lower() == TQChar(ch).lower() ); - } else if ( next == FinalState ) { - mmMatchLen = i; - stop = mmMinimal; - in = TRUE; - } else if ( (m & CharClassBit) != 0 ) { -#ifndef TQT_NO_REGEXP_CCLASS - const CharClass *cc = cl[m ^ CharClassBit]; - if ( cs ) - in = cc->in( ch ); - else if ( cc->negative() ) - in = cc->in( TQChar(ch).lower() ) && - cc->in( TQChar(ch).upper() ); - else - in = cc->in( TQChar(ch).lower() ) || - cc->in( TQChar(ch).upper() ); -#endif -#ifndef TQT_NO_REGEXP_BACKREF - } else { /* ( (m & BackRefBit) != 0 ) */ - int bref = m ^ BackRefBit; - int ell = j * ncap + ( bref - 1 ); - - in = bref <= ncap && mmCurCapBegin[ell] != EmptyCapture; - if ( in ) { - if ( cs ) - in = ( mmIn[mmPos + mmCurCapBegin[ell]] - == TQChar(ch) ); - else - in = ( mmIn[mmPos + mmCurCapBegin[ell]].lower() - == TQChar(ch).lower() ); - } - - if ( in ) { - int delta; - if ( mmCurCapEnd[ell] == EmptyCapture ) - delta = i - mmCurCapBegin[ell]; - else - delta = mmCurCapEnd[ell] - mmCurCapBegin[ell]; - - in = ( delta <= mmLen - (mmPos + i) ); - if ( in && delta > 1 ) { - int n = 1; - if ( cs ) { - while ( n < delta ) { - if ( mmIn[mmPos + - mmCurCapBegin[ell] + n] != - mmIn[mmPos + i + n] ) - break; - n++; - } - } else { - while ( n < delta ) { - TQChar a = mmIn[mmPos + - mmCurCapBegin[ell] + n]; - TQChar b = mmIn[mmPos + i + n]; - if ( a.lower() != b.lower() ) - break; - n++; - } - } - in = ( n == delta ); - if ( in ) - needSomeSleep = delta - 1; - } - } -#endif - } - } - - /* - We must now update our data structures. - */ - if ( in ) { -#ifndef TQT_NO_REGEXP_CAPTURE - int *capBegin, *capEnd; -#endif - /* - If the next state was not encountered yet, all - is fine. - */ - if ( (m = mmInNextStack[next]) == -1 ) { - m = nnext++; - mmNextStack[m] = next; - mmInNextStack[next] = m; -#ifndef TQT_NO_REGEXP_CAPTURE - capBegin = mmNextCapBegin + m * ncap; - capEnd = mmNextCapEnd + m * ncap; - - /* - Otherwise, we'll first maintain captures in - temporary arrays, and decide at the end whether - it's best to keep the previous capture zones or - the new ones. - */ - } else { - capBegin = mmTempCapBegin; - capEnd = mmTempCapEnd; -#endif - } - -#ifndef TQT_NO_REGEXP_CAPTURE - /* - Updating the capture zones is much of a task. - */ - if ( ncap > 0 ) { - memcpy( capBegin, mmCurCapBegin + j * ncap, - ncap * sizeof(int) ); - memcpy( capEnd, mmCurCapEnd + j * ncap, - ncap * sizeof(int) ); - int c = scur->atom, n = snext->atom; - int p = -1, q = -1; - int cap; - - /* - Lemma 1. For any x in the range [0..nf), we - have f[x].parent < x. - - Proof. By looking at startAtom(), it is - clear that cf < nf holds all the time, and - thus that f[nf].parent < nf. - */ - - /* - If we are reentering an atom, we empty all - capture zones inside it. - */ - if ( scur->reenter != 0 && - (q = at(*scur->reenter, next)) != 0 ) { - TQBitArray b; - b.fill( FALSE, nf ); - b.setBit( q, TRUE ); - for ( int ell = q + 1; ell < nf; ell++ ) { - if ( b.testBit(f[ell].parent) ) { - b.setBit( ell, TRUE ); - cap = f[ell].capture; - if ( cap >= 0 ) { - capBegin[cap] = EmptyCapture; - capEnd[cap] = EmptyCapture; - } - } - } - p = f[q].parent; - - /* - Otherwise, close the capture zones we are - leaving. We are leaving f[c].capture, - f[f[c].parent].capture, - f[f[f[c].parent].parent].capture, ..., - until f[x].capture, with x such that - f[x].parent is the youngest common ancestor - for c and n. - - We go up along c's and n's ancestry until - we find x. - */ - } else { - p = c; - q = n; - while ( p != q ) { - if ( p > q ) { - cap = f[p].capture; - if ( cap >= 0 ) { - if ( capBegin[cap] == i ) { - capBegin[cap] = EmptyCapture; - capEnd[cap] = EmptyCapture; - } else { - capEnd[cap] = i; - } - } - p = f[p].parent; - } else { - q = f[q].parent; - } - } - } - - /* - In any case, we now open the capture zones - we are entering. We work upwards from n - until we reach p (the parent of the atom we - reenter or the youngest common ancestor). - */ - while ( n > p ) { - cap = f[n].capture; - if ( cap >= 0 ) { - capBegin[cap] = i; - capEnd[cap] = EmptyCapture; - } - n = f[n].parent; - } - /* - If the next state was already in - mmNextStack, we must choose carefully which - capture zones we want to keep. - */ - if ( capBegin == mmTempCapBegin && - isBetterCapture(capBegin, capEnd, - mmNextCapBegin + m * ncap, - mmNextCapEnd + m * ncap) ) { - memcpy( mmNextCapBegin + m * ncap, capBegin, - ncap * sizeof(int) ); - memcpy( mmNextCapEnd + m * ncap, capEnd, - ncap * sizeof(int) ); - } - } -#ifndef TQT_NO_REGEXP_BACKREF - /* - We are done with updating the capture zones. - It's now time to put the next state to sleep, - if it needs to, and to remove it from - mmNextStack. - */ - if ( needSomeSleep > 0 ) { - zzZ = new int[1 + 2 * ncap]; - zzZ[0] = next; - if ( ncap > 0 ) { - memcpy( zzZ + 1, capBegin, ncap * sizeof(int) ); - memcpy( zzZ + 1 + ncap, capEnd, - ncap * sizeof(int) ); - } - mmInNextStack[mmNextStack[--nnext]] = -1; - mmSleeping.insert( i + needSomeSleep, zzZ ); - } -#endif -#endif - } - } - } -#ifndef TQT_NO_REGEXP_CAPTURE - /* - If we reached the final state, hurray! Copy the captured - zone. - */ - if ( ncap > 0 && (m = mmInNextStack[FinalState]) != -1 ) { - memcpy( mmCapBegin, mmNextCapBegin + m * ncap, ncap * sizeof(int) ); - memcpy( mmCapEnd, mmNextCapEnd + m * ncap, ncap * sizeof(int) ); - } -#ifndef TQT_NO_REGEXP_BACKREF - /* - It's time to wake up the sleepers. - */ - if ( !mmSleeping.isEmpty() ) { - while ( (zzZ = mmSleeping.take(i)) != 0 ) { - int next = zzZ[0]; - int *capBegin = zzZ + 1; - int *capEnd = zzZ + 1 + ncap; - bool copyOver = TRUE; - - if ( (m = mmInNextStack[zzZ[0]]) == -1 ) { - m = nnext++; - mmNextStack[m] = next; - mmInNextStack[next] = m; - } else { - copyOver = isBetterCapture( mmNextCapBegin + m * ncap, - mmNextCapEnd + m * ncap, - capBegin, capEnd ); - } - if ( copyOver ) { - memcpy( mmNextCapBegin + m * ncap, capBegin, - ncap * sizeof(int) ); - memcpy( mmNextCapEnd + m * ncap, capEnd, - ncap * sizeof(int) ); - } - delete[] zzZ; - } - } -#endif -#endif - for ( j = 0; j < nnext; j++ ) - mmInNextStack[mmNextStack[j]] = -1; - - // avoid needless iteration that confuses mmOneTestMatchedLen - if ( nnext == 1 && mmNextStack[0] == FinalState -#ifndef TQT_NO_REGEXP_BACKREF - && mmSleeping.isEmpty() -#endif - ) - stop = TRUE; - - tqSwap( mmCurStack, mmNextStack ); -#ifndef TQT_NO_REGEXP_CAPTURE - tqSwap( mmCurCapBegin, mmNextCapBegin ); - tqSwap( mmCurCapEnd, mmNextCapEnd ); -#endif - ncur = nnext; - nnext = 0; - i++; - } - -#ifndef TQT_NO_REGEXP_BACKREF - /* - If minimal matching is enabled, we might have some sleepers - left. - */ - while ( !mmSleeping.isEmpty() ) { - zzZ = mmSleeping.take( *TQIntDictIterator<int>(mmSleeping) ); - delete[] zzZ; - } -#endif - - mmOneTestMatchedLen = i - 1; - return ( mmMatchLen >= 0 ); -} - -#ifndef TQT_NO_REGEXP_CCLASS - -TQRegExpEngine::CharClass::CharClass() - : c( 0 ), n( FALSE ) -{ -#ifndef TQT_NO_REGEXP_OPTIM - occ1.fill( NoOccurrence, NumBadChars ); -#endif -} - -TQRegExpEngine::CharClass& TQRegExpEngine::CharClass::operator=( - const CharClass& cc ) -{ - c = cc.c; - r = cc.r.copy(); - n = cc.n; -#ifndef TQT_NO_REGEXP_OPTIM - occ1 = cc.occ1; -#endif - return *this; -} - -void TQRegExpEngine::CharClass::clear() -{ - c = 0; - r.resize( 0 ); - n = FALSE; -} - -void TQRegExpEngine::CharClass::setNegative( bool negative ) -{ - n = negative; -#ifndef TQT_NO_REGEXP_OPTIM - occ1.fill( 0, NumBadChars ); -#endif -} - -void TQRegExpEngine::CharClass::addCategories( int cats ) -{ - c |= cats; -#ifndef TQT_NO_REGEXP_OPTIM - occ1.fill( 0, NumBadChars ); -#endif -} - -void TQRegExpEngine::CharClass::addRange( ushort from, ushort to ) -{ - if ( from > to ) - tqSwap( from, to ); - int m = r.size(); - r.resize( m + 1 ); - r[m].from = from; - r[m].to = to; - -#ifndef TQT_NO_REGEXP_OPTIM - int i; - - if ( to - from < NumBadChars ) { - occ1.detach(); - if ( from % NumBadChars <= to % NumBadChars ) { - for ( i = from % NumBadChars; i <= to % NumBadChars; i++ ) - occ1[i] = 0; - } else { - for ( i = 0; i <= to % NumBadChars; i++ ) - occ1[i] = 0; - for ( i = from % NumBadChars; i < NumBadChars; i++ ) - occ1[i] = 0; - } - } else { - occ1.fill( 0, NumBadChars ); - } -#endif -} - -bool TQRegExpEngine::CharClass::in( TQChar ch ) const -{ -#ifndef TQT_NO_REGEXP_OPTIM - if ( occ1[BadChar(ch)] == NoOccurrence ) - return n; -#endif - - if ( c != 0 && (c & (1 << (int) ch.category())) != 0 ) - return !n; - for ( int i = 0; i < (int) r.size(); i++ ) { - if ( ch.tqunicode() >= r[i].from && ch.tqunicode() <= r[i].to ) - return !n; - } - return n; -} - -#if defined(TQT_DEBUG) -void TQRegExpEngine::CharClass::dump() const -{ - int i; - qDebug( " %stive character class", n ? "nega" : "posi" ); -#ifndef TQT_NO_REGEXP_CCLASS - if ( c != 0 ) - qDebug( " categories 0x%.8x", c ); -#endif - for ( i = 0; i < (int) r.size(); i++ ) - qDebug( " 0x%.4x through 0x%.4x", r[i].from, r[i].to ); -} -#endif -#endif - -TQRegExpEngine::Box::Box( TQRegExpEngine *engine ) - : eng( engine ), skipanchors( 0 ) -#ifndef TQT_NO_REGEXP_OPTIM - , earlyStart( 0 ), lateStart( 0 ), maxl( 0 ) -#endif -{ -#ifndef TQT_NO_REGEXP_OPTIM - occ1.fill( NoOccurrence, NumBadChars ); -#endif - minl = 0; -} - -TQRegExpEngine::Box& TQRegExpEngine::Box::operator=( const Box& b ) -{ - eng = b.eng; - ls = b.ls; - rs = b.rs; - lanchors = b.lanchors; - ranchors = b.ranchors; - skipanchors = b.skipanchors; -#ifndef TQT_NO_REGEXP_OPTIM - earlyStart = b.earlyStart; - lateStart = b.lateStart; - str = b.str; - leftStr = b.leftStr; - rightStr = b.rightStr; - maxl = b.maxl; - occ1 = b.occ1; -#endif - minl = b.minl; - return *this; -} - -void TQRegExpEngine::Box::set( TQChar ch ) -{ - ls.resize( 1 ); - ls[0] = eng->createState( ch ); - rs = ls; - rs.detach(); -#ifndef TQT_NO_REGEXP_OPTIM - str = ch; - leftStr = ch; - rightStr = ch; - maxl = 1; - occ1.detach(); - occ1[BadChar(ch)] = 0; -#endif - minl = 1; -} - -void TQRegExpEngine::Box::set( const CharClass& cc ) -{ - ls.resize( 1 ); - ls[0] = eng->createState( cc ); - rs = ls; - rs.detach(); -#ifndef TQT_NO_REGEXP_OPTIM - maxl = 1; - occ1 = cc.firstOccurrence(); -#endif - minl = 1; -} - -#ifndef TQT_NO_REGEXP_BACKREF -void TQRegExpEngine::Box::set( int bref ) -{ - ls.resize( 1 ); - ls[0] = eng->createState( bref ); - rs = ls; - rs.detach(); - if ( bref >= 1 && bref <= MaxBackRefs ) - skipanchors = Anchor_BackRef0Empty << bref; -#ifndef TQT_NO_REGEXP_OPTIM - maxl = InftyLen; -#endif - minl = 0; -} -#endif - -void TQRegExpEngine::Box::cat( const Box& b ) -{ - eng->addCatTransitions( rs, b.ls ); - addAnchorsToEngine( b ); - if ( minl == 0 ) { - mergeInto( &lanchors, b.lanchors ); - if ( skipanchors != 0 ) { - for ( int i = 0; i < (int) b.ls.size(); i++ ) { - int a = eng->anchorConcatenation( at(lanchors, b.ls[i]), - skipanchors ); - lanchors.insert( b.ls[i], a ); - } - } - mergeInto( &ls, b.ls ); - } - if ( b.minl == 0 ) { - mergeInto( &ranchors, b.ranchors ); - if ( b.skipanchors != 0 ) { - for ( int i = 0; i < (int) rs.size(); i++ ) { - int a = eng->anchorConcatenation( at(ranchors, rs[i]), - b.skipanchors ); - ranchors.insert( rs[i], a ); - } - } - mergeInto( &rs, b.rs ); - } else { - ranchors = b.ranchors; - rs = b.rs; - } - -#ifndef TQT_NO_REGEXP_OPTIM - if ( maxl != InftyLen ) { - if ( rightStr.length() + b.leftStr.length() > - TQMAX(str.length(), b.str.length()) ) { - earlyStart = minl - rightStr.length(); - lateStart = maxl - rightStr.length(); - str = rightStr + b.leftStr; - } else if ( b.str.length() > str.length() ) { - earlyStart = minl + b.earlyStart; - lateStart = maxl + b.lateStart; - str = b.str; - } - } - - if ( (int) leftStr.length() == maxl ) - leftStr += b.leftStr; - - if ( (int) b.rightStr.length() == b.maxl ) { - rightStr += b.rightStr; - } else { - rightStr = b.rightStr; - } - - if ( maxl == InftyLen || b.maxl == InftyLen ) { - maxl = InftyLen; - } else { - maxl += b.maxl; - } - - occ1.detach(); - for ( int i = 0; i < NumBadChars; i++ ) { - if ( b.occ1[i] != NoOccurrence && minl + b.occ1[i] < occ1[i] ) - occ1[i] = minl + b.occ1[i]; - } -#endif - - minl += b.minl; - if ( minl == 0 ) - skipanchors = eng->anchorConcatenation( skipanchors, b.skipanchors ); - else - skipanchors = 0; -} - -void TQRegExpEngine::Box::orx( const Box& b ) -{ - mergeInto( &ls, b.ls ); - mergeInto( &lanchors, b.lanchors ); - mergeInto( &rs, b.rs ); - mergeInto( &ranchors, b.ranchors ); - - if ( b.minl == 0 ) { - if ( minl == 0 ) - skipanchors = eng->anchorAlternation( skipanchors, b.skipanchors ); - else - skipanchors = b.skipanchors; - } - -#ifndef TQT_NO_REGEXP_OPTIM - occ1.detach(); - for ( int i = 0; i < NumBadChars; i++ ) { - if ( occ1[i] > b.occ1[i] ) - occ1[i] = b.occ1[i]; - } - earlyStart = 0; - lateStart = 0; - str = TQString(); - leftStr = TQString(); - rightStr = TQString(); - if ( b.maxl > maxl ) - maxl = b.maxl; -#endif - if ( b.minl < minl ) - minl = b.minl; -} - -void TQRegExpEngine::Box::plus( int atom ) -{ -#ifndef TQT_NO_REGEXP_CAPTURE - eng->addPlusTransitions( rs, ls, atom ); -#else - TQ_UNUSED( atom ); - eng->addCatTransitions( rs, ls ); -#endif - addAnchorsToEngine( *this ); -#ifndef TQT_NO_REGEXP_OPTIM - maxl = InftyLen; -#endif -} - -void TQRegExpEngine::Box::opt() -{ -#ifndef TQT_NO_REGEXP_OPTIM - earlyStart = 0; - lateStart = 0; - str = TQString(); - leftStr = TQString(); - rightStr = TQString(); -#endif - skipanchors = 0; - minl = 0; -} - -void TQRegExpEngine::Box::catAnchor( int a ) -{ - if ( a != 0 ) { - for ( int i = 0; i < (int) rs.size(); i++ ) { - a = eng->anchorConcatenation( at(ranchors, rs[i]), a ); - ranchors.insert( rs[i], a ); - } - if ( minl == 0 ) - skipanchors = eng->anchorConcatenation( skipanchors, a ); - } -} - -#ifndef TQT_NO_REGEXP_OPTIM -void TQRegExpEngine::Box::setupHeuristics() -{ - eng->goodEarlyStart = earlyStart; - eng->goodLateStart = lateStart; - eng->goodStr = eng->cs ? str : str.lower(); - - eng->minl = minl; - if ( eng->cs ) { - /* - A regular expression such as 112|1 has occ1['2'] = 2 and minl = - 1 at this point. An entry of occ1 has to be at most minl or - infinity for the rest of the algorithm to go well. - - We waited until here before normalizing these cases (instead of - doing it in Box::orx()) because sometimes things improve by - themselves. Consider for example (112|1)34. - */ - for ( int i = 0; i < NumBadChars; i++ ) { - if ( occ1[i] != NoOccurrence && occ1[i] >= minl ) - occ1[i] = minl; - } - eng->occ1 = occ1; - } else { - eng->occ1.fill( 0, NumBadChars ); - } - - eng->heuristicallyChooseHeuristic(); -} -#endif - -#if defined(TQT_DEBUG) -void TQRegExpEngine::Box::dump() const -{ - int i; - qDebug( "Box of at least %d character%s", minl, minl == 1 ? "" : "s" ); - qDebug( " Left states:" ); - for ( i = 0; i < (int) ls.size(); i++ ) { - if ( at(lanchors, ls[i]) == 0 ) - qDebug( " %d", ls[i] ); - else - qDebug( " %d [anchors 0x%.8x]", ls[i], lanchors[ls[i]] ); - } - qDebug( " Right states:" ); - for ( i = 0; i < (int) rs.size(); i++ ) { - if ( at(ranchors, rs[i]) == 0 ) - qDebug( " %d", rs[i] ); - else - qDebug( " %d [anchors 0x%.8x]", rs[i], ranchors[rs[i]] ); - } - qDebug( " Skip anchors: 0x%.8x", skipanchors ); -} -#endif - -void TQRegExpEngine::Box::addAnchorsToEngine( const Box& to ) const -{ - for ( int i = 0; i < (int) to.ls.size(); i++ ) { - for ( int j = 0; j < (int) rs.size(); j++ ) { - int a = eng->anchorConcatenation( at(ranchors, rs[j]), - at(to.lanchors, to.ls[i]) ); - eng->addAnchors( rs[j], to.ls[i], a ); - } - } -} - -int TQRegExpEngine::getChar() -{ - return ( yyPos == yyLen ) ? EOS : yyIn[yyPos++].tqunicode(); -} - -int TQRegExpEngine::getEscape() -{ -#ifndef TQT_NO_REGEXP_ESCAPE - const char tab[] = "afnrtv"; // no b, as \b means word boundary - const char backTab[] = "\a\f\n\r\t\v"; - ushort low; - int i; -#endif - ushort val; - int prevCh = yyCh; - - if ( prevCh == EOS ) { - error( RXERR_END ); - return Tok_Char | '\\'; - } - yyCh = getChar(); -#ifndef TQT_NO_REGEXP_ESCAPE - if ( (prevCh & ~0xff) == 0 ) { - const char *p = strchr( tab, prevCh ); - if ( p != 0 ) - return Tok_Char | backTab[p - tab]; - } -#endif - - switch ( prevCh ) { -#ifndef TQT_NO_REGEXP_ESCAPE - case '0': - val = 0; - for ( i = 0; i < 3; i++ ) { - if ( yyCh >= '0' && yyCh <= '7' ) - val = ( val << 3 ) | ( yyCh - '0' ); - else - break; - yyCh = getChar(); - } - if ( (val & ~0377) != 0 ) - error( RXERR_OCTAL ); - return Tok_Char | val; -#endif -#ifndef TQT_NO_REGEXP_ESCAPE - case 'B': - return Tok_NonWord; -#endif -#ifndef TQT_NO_REGEXP_CCLASS - case 'D': - // see TQChar::isDigit() - yyCharClass->addCategories( 0x7fffffef ); - return Tok_CharClass; - case 'S': - // see TQChar::isSpace() - yyCharClass->addCategories( 0x7ffff87f ); - yyCharClass->addRange( 0x0000, 0x0008 ); - yyCharClass->addRange( 0x000e, 0x001f ); - yyCharClass->addRange( 0x007f, 0x009f ); - return Tok_CharClass; - case 'W': - // see TQChar::isLetterOrNumber() - yyCharClass->addCategories( 0x7fe07f8f ); - yyCharClass->addRange( 0x203f, 0x2040 ); - yyCharClass->addSingleton( 0x2040 ); - yyCharClass->addSingleton( 0x30fb ); - yyCharClass->addRange( 0xfe33, 0xfe34 ); - yyCharClass->addRange( 0xfe4d, 0xfe4f ); - yyCharClass->addSingleton( 0xff3f ); - yyCharClass->addSingleton( 0xff65 ); - return Tok_CharClass; -#endif -#ifndef TQT_NO_REGEXP_ESCAPE - case 'b': - return Tok_Word; -#endif -#ifndef TQT_NO_REGEXP_CCLASS - case 'd': - // see TQChar::isDigit() - yyCharClass->addCategories( 0x00000010 ); - return Tok_CharClass; - case 's': - // see TQChar::isSpace() - yyCharClass->addCategories( 0x00000380 ); - yyCharClass->addRange( 0x0009, 0x000d ); - return Tok_CharClass; - case 'w': - // see TQChar::isLetterOrNumber() - yyCharClass->addCategories( 0x000f8070 ); - yyCharClass->addSingleton( 0x005f ); // '_' - return Tok_CharClass; -#endif -#ifndef TQT_NO_REGEXP_ESCAPE - case 'x': - val = 0; - for ( i = 0; i < 4; i++ ) { - low = TQChar( yyCh ).lower(); - if ( low >= '0' && low <= '9' ) - val = ( val << 4 ) | ( low - '0' ); - else if ( low >= 'a' && low <= 'f' ) - val = ( val << 4 ) | ( low - 'a' + 10 ); - else - break; - yyCh = getChar(); - } - return Tok_Char | val; -#endif - default: - if ( prevCh >= '1' && prevCh <= '9' ) { -#ifndef TQT_NO_REGEXP_BACKREF - val = prevCh - '0'; - while ( yyCh >= '0' && yyCh <= '9' ) { - val = ( val * 10 ) + ( yyCh - '0' ); - yyCh = getChar(); - } - return Tok_BackRef | val; -#else - error( RXERR_DISABLED ); -#endif - } - return Tok_Char | prevCh; - } -} - -#ifndef TQT_NO_REGEXP_INTERVAL -int TQRegExpEngine::getRep( int def ) -{ - if ( yyCh >= '0' && yyCh <= '9' ) { - int rep = 0; - do { - rep = 10 * rep + yyCh - '0'; - if ( rep >= InftyRep ) { - error( RXERR_REPETITION ); - rep = def; - } - yyCh = getChar(); - } while ( yyCh >= '0' && yyCh <= '9' ); - return rep; - } else { - return def; - } -} -#endif - -#ifndef TQT_NO_REGEXP_LOOKAHEAD -void TQRegExpEngine::skipChars( int n ) -{ - if ( n > 0 ) { - yyPos += n - 1; - yyCh = getChar(); - } -} -#endif - -void TQRegExpEngine::error( const char *msg ) -{ - if ( yyError.isEmpty() ) - yyError = TQString::tqfromLatin1( msg ); -} - -void TQRegExpEngine::startTokenizer( const TQChar *rx, int len ) -{ - yyIn = rx; - yyPos0 = 0; - yyPos = 0; - yyLen = len; - yyCh = getChar(); - yyCharClass = new CharClass; - yyMinRep = 0; - yyMaxRep = 0; - yyError = TQString(); -} - -int TQRegExpEngine::getToken() -{ -#ifndef TQT_NO_REGEXP_CCLASS - ushort pendingCh = 0; - bool charPending; - bool rangePending; - int tok; -#endif - int prevCh = yyCh; - - yyPos0 = yyPos - 1; -#ifndef TQT_NO_REGEXP_CCLASS - yyCharClass->clear(); -#endif - yyMinRep = 0; - yyMaxRep = 0; - yyCh = getChar(); - - switch ( prevCh ) { - case EOS: - yyPos0 = yyPos; - return Tok_Eos; - case '$': - return Tok_Dollar; - case '(': - if ( yyCh == '?' ) { - prevCh = getChar(); - yyCh = getChar(); - switch ( prevCh ) { -#ifndef TQT_NO_REGEXP_LOOKAHEAD - case '!': - return Tok_NegLookahead; - case '=': - return Tok_PosLookahead; -#endif - case ':': - return Tok_MagicLeftParen; - default: - error( RXERR_LOOKAHEAD ); - return Tok_MagicLeftParen; - } - } else { - return Tok_LeftParen; - } - case ')': - return Tok_RightParen; - case '*': - yyMinRep = 0; - yyMaxRep = InftyRep; - return Tok_Quantifier; - case '+': - yyMinRep = 1; - yyMaxRep = InftyRep; - return Tok_Quantifier; - case '.': -#ifndef TQT_NO_REGEXP_CCLASS - yyCharClass->setNegative( TRUE ); -#endif - return Tok_CharClass; - case '?': - yyMinRep = 0; - yyMaxRep = 1; - return Tok_Quantifier; - case '[': -#ifndef TQT_NO_REGEXP_CCLASS - if ( yyCh == '^' ) { - yyCharClass->setNegative( TRUE ); - yyCh = getChar(); - } - charPending = FALSE; - rangePending = FALSE; - do { - if ( yyCh == '-' && charPending && !rangePending ) { - rangePending = TRUE; - yyCh = getChar(); - } else { - if ( charPending && !rangePending ) { - yyCharClass->addSingleton( pendingCh ); - charPending = FALSE; - } - if ( yyCh == '\\' ) { - yyCh = getChar(); - tok = getEscape(); - if ( tok == Tok_Word ) - tok = '\b'; - } else { - tok = Tok_Char | yyCh; - yyCh = getChar(); - } - if ( tok == Tok_CharClass ) { - if ( rangePending ) { - yyCharClass->addSingleton( '-' ); - yyCharClass->addSingleton( pendingCh ); - charPending = FALSE; - rangePending = FALSE; - } - } else if ( (tok & Tok_Char) != 0 ) { - if ( rangePending ) { - yyCharClass->addRange( pendingCh, tok ^ Tok_Char ); - charPending = FALSE; - rangePending = FALSE; - } else { - pendingCh = tok ^ Tok_Char; - charPending = TRUE; - } - } else { - error( RXERR_CHARCLASS ); - } - } - } while ( yyCh != ']' && yyCh != EOS ); - if ( rangePending ) - yyCharClass->addSingleton( '-' ); - if ( charPending ) - yyCharClass->addSingleton( pendingCh ); - if ( yyCh == EOS ) - error( RXERR_END ); - else - yyCh = getChar(); - return Tok_CharClass; -#else - error( RXERR_END ); - return Tok_Char | '['; -#endif - case '\\': - return getEscape(); - case ']': - error( RXERR_LEFTDELIM ); - return Tok_Char | ']'; - case '^': - return Tok_Caret; - case '{': -#ifndef TQT_NO_REGEXP_INTERVAL - yyMinRep = getRep( 0 ); - yyMaxRep = yyMinRep; - if ( yyCh == ',' ) { - yyCh = getChar(); - yyMaxRep = getRep( InftyRep ); - } - if ( yyMaxRep < yyMinRep ) - tqSwap( yyMinRep, yyMaxRep ); - if ( yyCh != '}' ) - error( RXERR_REPETITION ); - yyCh = getChar(); - return Tok_Quantifier; -#else - error( RXERR_DISABLED ); - return Tok_Char | '{'; -#endif - case '|': - return Tok_Bar; - case '}': - error( RXERR_LEFTDELIM ); - return Tok_Char | '}'; - default: - return Tok_Char | prevCh; - } -} - -int TQRegExpEngine::parse( const TQChar *pattern, int len ) -{ - valid = TRUE; - startTokenizer( pattern, len ); - yyTok = getToken(); -#ifndef TQT_NO_REGEXP_CAPTURE - yyMayCapture = TRUE; -#else - yyMayCapture = FALSE; -#endif - -#ifndef TQT_NO_REGEXP_CAPTURE - int atom = startAtom( FALSE ); -#endif - CharClass anything; - Box box( this ); // create InitialState - box.set( anything ); - Box rightBox( this ); // create FinalState - rightBox.set( anything ); - - Box middleBox( this ); - parseExpression( &middleBox ); -#ifndef TQT_NO_REGEXP_CAPTURE - finishAtom( atom ); -#endif -#ifndef TQT_NO_REGEXP_OPTIM - middleBox.setupHeuristics(); -#endif - box.cat( middleBox ); - box.cat( rightBox ); - delete yyCharClass; - yyCharClass = 0; - - officialncap = ncap; -#ifndef TQT_NO_REGEXP_BACKREF - if ( nbrefs > ncap ) - ncap = nbrefs; -#endif - - /* - We use one TQMemArray<int> for all the big data used a lot in - matchHere() and friends. - */ -#ifndef TQT_NO_REGEXP_OPTIM - mmSlideTabSize = TQMAX( minl + 1, 16 ); -#else - mmSlideTabSize = 0; -#endif - mmBigArray.resize( (3 + 4 * ncap) * ns + 4 * ncap + mmSlideTabSize ); - - mmInNextStack = mmBigArray.data(); - memset( mmInNextStack, -1, ns * sizeof(int) ); - mmCurStack = mmInNextStack + ns; - mmNextStack = mmInNextStack + 2 * ns; - - mmCurCapBegin = mmInNextStack + 3 * ns; - mmNextCapBegin = mmCurCapBegin + ncap * ns; - mmCurCapEnd = mmCurCapBegin + 2 * ncap * ns; - mmNextCapEnd = mmCurCapBegin + 3 * ncap * ns; - - mmTempCapBegin = mmCurCapBegin + 4 * ncap * ns; - mmTempCapEnd = mmTempCapBegin + ncap; - mmCapBegin = mmTempCapBegin + 2 * ncap; - mmCapEnd = mmTempCapBegin + 3 * ncap; - - mmSlideTab = mmTempCapBegin + 4 * ncap; - - if ( !yyError.isEmpty() ) - return -1; - -#ifndef TQT_NO_REGEXP_OPTIM - State *sinit = s[InitialState]; - caretAnchored = ( sinit->anchors != 0 ); - if ( caretAnchored ) { - TQMap<int, int>& anchors = *sinit->anchors; - TQMap<int, int>::ConstIterator a; - for ( a = anchors.begin(); a != anchors.end(); ++a ) { - if ( -#ifndef TQT_NO_REGEXP_ANCHOR_ALT - (*a & Anchor_Alternation) != 0 || -#endif - (*a & Anchor_Caret) == 0 ) { - caretAnchored = FALSE; - break; - } - } - } -#endif - return yyPos0; -} - -void TQRegExpEngine::parseAtom( Box *box ) -{ -#ifndef TQT_NO_REGEXP_LOOKAHEAD - TQRegExpEngine *eng = 0; - bool neg; - int len; -#endif - - if ( (yyTok & Tok_Char) != 0 ) { - box->set( TQChar(yyTok ^ Tok_Char) ); - } else { -#ifndef TQT_NO_REGEXP_OPTIM - trivial = FALSE; -#endif - switch ( yyTok ) { - case Tok_Dollar: - box->catAnchor( Anchor_Dollar ); - break; - case Tok_Caret: - box->catAnchor( Anchor_Caret ); - break; -#ifndef TQT_NO_REGEXP_LOOKAHEAD - case Tok_PosLookahead: - case Tok_NegLookahead: - neg = ( yyTok == Tok_NegLookahead ); - eng = new TQRegExpEngine( cs ); - len = eng->parse( yyIn + yyPos - 1, yyLen - yyPos + 1 ); - if ( len >= 0 ) - skipChars( len ); - else - error( RXERR_LOOKAHEAD ); - box->catAnchor( addLookahead(eng, neg) ); - yyTok = getToken(); - if ( yyTok != Tok_RightParen ) - error( RXERR_LOOKAHEAD ); - break; -#endif -#ifndef TQT_NO_REGEXP_ESCAPE - case Tok_Word: - box->catAnchor( Anchor_Word ); - break; - case Tok_NonWord: - box->catAnchor( Anchor_NonWord ); - break; -#endif - case Tok_LeftParen: - case Tok_MagicLeftParen: - yyTok = getToken(); - parseExpression( box ); - if ( yyTok != Tok_RightParen ) - error( RXERR_END ); - break; - case Tok_CharClass: - box->set( *yyCharClass ); - break; - case Tok_Quantifier: - error( RXERR_REPETITION ); - break; - default: -#ifndef TQT_NO_REGEXP_BACKREF - if ( (yyTok & Tok_BackRef) != 0 ) - box->set( yyTok ^ Tok_BackRef ); - else -#endif - error( RXERR_DISABLED ); - } - } - yyTok = getToken(); -} - -void TQRegExpEngine::parseFactor( Box *box ) -{ -#ifndef TQT_NO_REGEXP_CAPTURE - int atom = startAtom( yyMayCapture && yyTok == Tok_LeftParen ); -#else - static const int atom = 0; -#endif - -#ifndef TQT_NO_REGEXP_INTERVAL -#define YYREDO() \ - yyIn = in, yyPos0 = pos0, yyPos = pos, yyLen = len, yyCh = ch, \ - *yyCharClass = charClass, yyMinRep = 0, yyMaxRep = 0, yyTok = tok - - const TQChar *in = yyIn; - int pos0 = yyPos0; - int pos = yyPos; - int len = yyLen; - int ch = yyCh; - CharClass charClass; - if ( yyTok == Tok_CharClass ) - charClass = *yyCharClass; - int tok = yyTok; - bool mayCapture = yyMayCapture; -#endif - - parseAtom( box ); -#ifndef TQT_NO_REGEXP_CAPTURE - finishAtom( atom ); -#endif - - if ( yyTok == Tok_Quantifier ) { -#ifndef TQT_NO_REGEXP_OPTIM - trivial = FALSE; -#endif - if ( yyMaxRep == InftyRep ) { - box->plus( atom ); -#ifndef TQT_NO_REGEXP_INTERVAL - } else if ( yyMaxRep == 0 ) { - box->clear(); -#endif - } - if ( yyMinRep == 0 ) - box->opt(); - -#ifndef TQT_NO_REGEXP_INTERVAL - yyMayCapture = FALSE; - int alpha = ( yyMinRep == 0 ) ? 0 : yyMinRep - 1; - int beta = ( yyMaxRep == InftyRep ) ? 0 : yyMaxRep - ( alpha + 1 ); - - Box rightBox( this ); - int i; - - for ( i = 0; i < beta; i++ ) { - YYREDO(); - Box leftBox( this ); - parseAtom( &leftBox ); - leftBox.cat( rightBox ); - leftBox.opt(); - rightBox = leftBox; - } - for ( i = 0; i < alpha; i++ ) { - YYREDO(); - Box leftBox( this ); - parseAtom( &leftBox ); - leftBox.cat( rightBox ); - rightBox = leftBox; - } - rightBox.cat( *box ); - *box = rightBox; -#endif - yyTok = getToken(); -#ifndef TQT_NO_REGEXP_INTERVAL - yyMayCapture = mayCapture; -#endif - } -#undef YYREDO -} - -void TQRegExpEngine::parseTerm( Box *box ) -{ -#ifndef TQT_NO_REGEXP_OPTIM - if ( yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar ) - parseFactor( box ); -#endif - while ( yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar ) { - Box rightBox( this ); - parseFactor( &rightBox ); - box->cat( rightBox ); - } -} - -void TQRegExpEngine::parseExpression( Box *box ) -{ - parseTerm( box ); - while ( yyTok == Tok_Bar ) { -#ifndef TQT_NO_REGEXP_OPTIM - trivial = FALSE; -#endif - Box rightBox( this ); - yyTok = getToken(); - parseTerm( &rightBox ); - box->orx( rightBox ); - } -} - -/* - The struct TQRegExpPrivate contains the private data of a regular - expression other than the automaton. It makes it possible for many - TQRegExp objects to use the same TQRegExpEngine object with different - TQRegExpPrivate objects. -*/ -struct TQRegExpPrivate -{ - TQString pattern; // regular-expression or wildcard pattern - TQString rxpattern; // regular-expression pattern -#ifndef TQT_NO_REGEXP_WILDCARD - bool wc : 1; // wildcard mode? -#endif - bool min : 1; // minimal matching? (instead of maximal) - bool cs : 1; // case sensitive? -#ifndef TQT_NO_REGEXP_CAPTURE - TQString t; // last string passed to TQRegExp::search() or searchRev() - TQStringList capturedCache; // what TQRegExp::capturedTexts() returned last -#endif - TQMemArray<int> captured; // what TQRegExpEngine::search() returned last - - TQRegExpPrivate() { captured.fill( -1, 2 ); } -}; - -#ifndef TQT_NO_REGEXP_OPTIM -static TQSingleCleanupHandler<TQCache<TQRegExpEngine> > cleanup_cache; -# ifndef TQT_THREAD_SUPPORT -static TQCache<TQRegExpEngine> *engineCache = 0; -# endif // TQT_THREAD_SUPPORT -#endif // TQT_NO_REGEXP_OPTIM - -static void regexpEngine( TQRegExpEngine *&eng, const TQString &pattern, - bool caseSensitive, bool deref ) -{ -# ifdef TQT_THREAD_SUPPORT - static TQThreadStorage<TQCache<TQRegExpEngine> *> engineCaches; - TQCache<TQRegExpEngine> *engineCache = 0; - TQThreadInstance *currentThread = TQThreadInstance::current(); - if (currentThread) - engineCache = engineCaches.localData(); -#endif // TQT_THREAD_SUPPORT - - if ( !deref ) { -#ifndef TQT_NO_REGEXP_OPTIM -# ifdef TQT_THREAD_SUPPORT - if ( currentThread ) -# endif - { - if ( engineCache != 0 ) { - eng = engineCache->take( pattern ); - if ( eng == 0 || eng->caseSensitive() != caseSensitive ) { - delete eng; - } else { - eng->ref(); - return; - } - } - } -#endif // TQT_NO_REGEXP_OPTIM - eng = new TQRegExpEngine( pattern, caseSensitive ); - return; - } - - if ( eng->deref() ) { -#ifndef TQT_NO_REGEXP_OPTIM -# ifdef TQT_THREAD_SUPPORT - if ( currentThread ) -# endif - { - if ( engineCache == 0 ) { - engineCache = new TQCache<TQRegExpEngine>; - engineCache->setAutoDelete( TRUE ); -# ifdef TQT_THREAD_SUPPORT - engineCaches.setLocalData(engineCache); -# else - cleanup_cache.set( &engineCache ); -# endif // !TQT_THREAD_SUPPORT - } - if ( !pattern.isNull() && - engineCache->insert(pattern, eng, 4 + pattern.length() / 4) ) - return; - } -#else - TQ_UNUSED( pattern ); -#endif // TQT_NO_REGEXP_OPTIM - delete eng; - eng = 0; - } -} - -/*! - \enum TQRegExp::CaretMode - - The CaretMode enum defines the different meanings of the caret - (<b>^</b>) in a regular expression. The possible values are: - - \value CaretAtZero - The caret corresponds to index 0 in the searched string. - - \value CaretAtOffset - The caret corresponds to the start offset of the search. - - \value CaretWontMatch - The caret never matches. -*/ - -/*! - Constructs an empty regexp. - - \sa isValid() errorString() -*/ -TQRegExp::TQRegExp() - : eng( 0 ) -{ - priv = new TQRegExpPrivate; -#ifndef TQT_NO_REGEXP_WILDCARD - priv->wc = FALSE; -#endif - priv->min = FALSE; - priv->cs = TRUE; -} - -/*! - Constructs a regular expression object for the given \a pattern - string. The pattern must be given using wildcard notation if \a - wildcard is TRUE (default is FALSE). The pattern is case - sensitive, unless \a caseSensitive is FALSE. Matching is greedy - (maximal), but can be changed by calling setMinimal(). - - \sa setPattern() setCaseSensitive() setWildcard() setMinimal() -*/ -TQRegExp::TQRegExp( const TQString& pattern, bool caseSensitive, bool wildcard ) - : eng( 0 ) -{ - priv = new TQRegExpPrivate; - priv->pattern = pattern; -#ifndef TQT_NO_REGEXP_WILDCARD - priv->wc = wildcard; -#endif - priv->min = FALSE; - priv->cs = caseSensitive; -} - -/*! - Constructs a regular expression as a copy of \a rx. - - \sa operator=() -*/ -TQRegExp::TQRegExp( const TQRegExp& rx ) - : eng( 0 ) -{ - priv = new TQRegExpPrivate; - operator=( rx ); -} - -/*! - Destroys the regular expression and cleans up its internal data. -*/ -TQRegExp::~TQRegExp() -{ - invalidateEngine(); - delete priv; -} - -/*! - Copies the regular expression \a rx and returns a reference to the - copy. The case sensitivity, wildcard and minimal matching options - are also copied. -*/ -TQRegExp& TQRegExp::operator=( const TQRegExp& rx ) -{ - TQRegExpEngine *otherEng = rx.eng; - if ( otherEng != 0 ) - otherEng->ref(); - invalidateEngine(); - eng = otherEng; - priv->pattern = rx.priv->pattern; - priv->rxpattern = rx.priv->rxpattern; -#ifndef TQT_NO_REGEXP_WILDCARD - priv->wc = rx.priv->wc; -#endif - priv->min = rx.priv->min; - priv->cs = rx.priv->cs; -#ifndef TQT_NO_REGEXP_CAPTURE - priv->t = rx.priv->t; - priv->capturedCache = rx.priv->capturedCache; -#endif - priv->captured = rx.priv->captured; - return *this; -} - -/*! - Returns TRUE if this regular expression is equal to \a rx; - otherwise returns FALSE. - - Two TQRegExp objects are equal if they have the same pattern - strings and the same settings for case sensitivity, wildcard and - minimal matching. -*/ -bool TQRegExp::operator==( const TQRegExp& rx ) const -{ - return priv->pattern == rx.priv->pattern && -#ifndef TQT_NO_REGEXP_WILDCARD - priv->wc == rx.priv->wc && -#endif - priv->min == rx.priv->min && - priv->cs == rx.priv->cs; -} - -/*! - \fn bool TQRegExp::operator!=( const TQRegExp& rx ) const - - Returns TRUE if this regular expression is not equal to \a rx; - otherwise returns FALSE. - - \sa operator==() -*/ - -/*! - Returns TRUE if the pattern string is empty; otherwise returns - FALSE. - - If you call exactMatch() with an empty pattern on an empty string - it will return TRUE; otherwise it returns FALSE since it operates - over the whole string. If you call search() with an empty pattern - on \e any string it will return the start offset (0 by default) - because the empty pattern matches the 'emptiness' at the start of - the string. In this case the length of the match returned by - matchedLength() will be 0. - - See TQString::isEmpty(). -*/ - -bool TQRegExp::isEmpty() const -{ - return priv->pattern.isEmpty(); -} - -/*! - Returns TRUE if the regular expression is valid; otherwise returns - FALSE. An invalid regular expression never matches. - - The pattern <b>[a-z</b> is an example of an invalid pattern, since - it lacks a closing square bracket. - - Note that the validity of a regexp may also depend on the setting - of the wildcard flag, for example <b>*.html</b> is a valid - wildcard regexp but an invalid full regexp. - - \sa errorString() -*/ -bool TQRegExp::isValid() const -{ - if ( priv->pattern.isEmpty() ) { - return TRUE; - } else { - prepareEngine(); - return eng->isValid(); - } -} - -/*! - Returns the pattern string of the regular expression. The pattern - has either regular expression syntax or wildcard syntax, depending - on wildcard(). - - \sa setPattern() -*/ -TQString TQRegExp::pattern() const -{ - return priv->pattern; -} - -/*! - Sets the pattern string to \a pattern. The case sensitivity, - wildcard and minimal matching options are not changed. - - \sa pattern() -*/ -void TQRegExp::setPattern( const TQString& pattern ) -{ - if ( priv->pattern != pattern ) { - priv->pattern = pattern; - invalidateEngine(); - } -} - -/*! - Returns TRUE if case sensitivity is enabled; otherwise returns - FALSE. The default is TRUE. - - \sa setCaseSensitive() -*/ -bool TQRegExp::caseSensitive() const -{ - return priv->cs; -} - -/*! - Sets case sensitive matching to \a sensitive. - - If \a sensitive is TRUE, <b>\\.txt$</b> matches \c{readme.txt} but - not \c{README.TXT}. - - \sa caseSensitive() -*/ -void TQRegExp::setCaseSensitive( bool sensitive ) -{ - if ( sensitive != priv->cs ) { - priv->cs = sensitive; - invalidateEngine(); - } -} - -#ifndef TQT_NO_REGEXP_WILDCARD -/*! - Returns TRUE if wildcard mode is enabled; otherwise returns FALSE. - The default is FALSE. - - \sa setWildcard() -*/ -bool TQRegExp::wildcard() const -{ - return priv->wc; -} - -/*! - Sets the wildcard mode for the regular expression. The default is - FALSE. - - Setting \a wildcard to TRUE enables simple shell-like wildcard - matching. (See \link #wildcard-matching wildcard matching - (globbing) \endlink.) - - For example, <b>r*.txt</b> matches the string \c{readme.txt} in - wildcard mode, but does not match \c{readme}. - - \sa wildcard() -*/ -void TQRegExp::setWildcard( bool wildcard ) -{ - if ( wildcard != priv->wc ) { - priv->wc = wildcard; - invalidateEngine(); - } -} -#endif - -/*! - Returns TRUE if minimal (non-greedy) matching is enabled; - otherwise returns FALSE. - - \sa setMinimal() -*/ -bool TQRegExp::minimal() const -{ - return priv->min; -} - -/*! - Enables or disables minimal matching. If \a minimal is FALSE, - matching is greedy (maximal) which is the default. - - For example, suppose we have the input string "We must be - \<b>bold\</b>, very \<b>bold\</b>!" and the pattern - <b>\<b>.*\</b></b>. With the default greedy (maximal) matching, - the match is "We must be <u>\<b>bold\</b>, very - \<b>bold\</b></u>!". But with minimal (non-greedy) matching the - first match is: "We must be <u>\<b>bold\</b></u>, very - \<b>bold\</b>!" and the second match is "We must be \<b>bold\</b>, - very <u>\<b>bold\</b></u>!". In practice we might use the pattern - <b>\<b>[^\<]+\</b></b> instead, although this will still fail for - nested tags. - - \sa minimal() -*/ -void TQRegExp::setMinimal( bool minimal ) -{ - priv->min = minimal; -} - -/*! - Returns TRUE if \a str is matched exactly by this regular - expression; otherwise returns FALSE. You can determine how much of - the string was matched by calling matchedLength(). - - For a given regexp string, R, exactMatch("R") is the equivalent of - search("^R$") since exactMatch() effectively encloses the regexp - in the start of string and end of string anchors, except that it - sets matchedLength() differently. - - For example, if the regular expression is <b>blue</b>, then - exactMatch() returns TRUE only for input \c blue. For inputs \c - bluebell, \c blutak and \c lightblue, exactMatch() returns FALSE - and matchedLength() will return 4, 3 and 0 respectively. - - Although const, this function sets matchedLength(), - capturedTexts() and pos(). - - \sa search() searchRev() TQRegExpValidator -*/ -bool TQRegExp::exactMatch( const TQString& str ) const -{ - prepareEngineForMatch( str ); - eng->match( str, 0, priv->min, TRUE, 0, priv->captured ); - if ( priv->captured[1] == (int) str.length() ) { - return TRUE; - } else { - priv->captured[0] = 0; - priv->captured[1] = eng->partialMatchLength(); - return FALSE; - } -} - -#ifndef TQT_NO_COMPAT -/*! \obsolete - - Attempts to match in \a str, starting from position \a index. - Returns the position of the match, or -1 if there was no match. - - The length of the match is stored in \a *len, unless \a len is a - null pointer. - - If \a indexIsStart is TRUE (the default), the position \a index in - the string will match the start of string anchor, <b>^</b>, in the - regexp, if present. Otherwise, position 0 in \a str will match. - - Use search() and matchedLength() instead of this function. - - \sa TQString::mid() TQConstString -*/ -int TQRegExp::match( const TQString& str, int index, int *len, - bool indexIsStart ) const -{ - int pos = search( str, index, indexIsStart ? CaretAtOffset : CaretAtZero ); - if ( len != 0 ) - *len = matchedLength(); - return pos; -} -#endif // TQT_NO_COMPAT - -int TQRegExp::search( const TQString& str, int offset ) const -{ - return search( str, offset, CaretAtZero ); -} - -/*! - Attempts to find a match in \a str from position \a offset (0 by - default). If \a offset is -1, the search starts at the last - character; if -2, at the next to last character; etc. - - Returns the position of the first match, or -1 if there was no - match. - - The \a caretMode parameter can be used to instruct whether <b>^</b> - should match at index 0 or at \a offset. - - You might prefer to use TQString::find(), TQString::contains() or - even TQStringList::grep(). To replace matches use - TQString::replace(). - - Example: - \code - TQString str = "offsets: 1.23 .50 71.00 6.00"; - TQRegExp rx( "\\d*\\.\\d+" ); // primitive floating point matching - int count = 0; - int pos = 0; - while ( (pos = rx.search(str, pos)) != -1 ) { - count++; - pos += rx.matchedLength(); - } - // pos will be 9, 14, 18 and finally 24; count will end up as 4 - \endcode - - Although const, this function sets matchedLength(), - capturedTexts() and pos(). - - \sa searchRev() exactMatch() -*/ - -int TQRegExp::search( const TQString& str, int offset, CaretMode caretMode ) const -{ - prepareEngineForMatch( str ); - if ( offset < 0 ) - offset += str.length(); - eng->match( str, offset, priv->min, FALSE, caretIndex(offset, caretMode), - priv->captured ); - return priv->captured[0]; -} - - -int TQRegExp::searchRev( const TQString& str, int offset ) const -{ - return searchRev( str, offset, CaretAtZero ); -} - -/*! - Attempts to find a match backwards in \a str from position \a - offset. If \a offset is -1 (the default), the search starts at the - last character; if -2, at the next to last character; etc. - - Returns the position of the first match, or -1 if there was no - match. - - The \a caretMode parameter can be used to instruct whether <b>^</b> - should match at index 0 or at \a offset. - - Although const, this function sets matchedLength(), - capturedTexts() and pos(). - - \warning Searching backwards is much slower than searching - forwards. - - \sa search() exactMatch() -*/ - -int TQRegExp::searchRev( const TQString& str, int offset, - CaretMode caretMode ) const -{ - prepareEngineForMatch( str ); - if ( offset < 0 ) - offset += str.length(); - if ( offset < 0 || offset > (int) str.length() ) { - priv->captured.detach(); - priv->captured.fill( -1 ); - return -1; - } - - while ( offset >= 0 ) { - eng->match( str, offset, priv->min, TRUE, caretIndex(offset, caretMode), - priv->captured ); - if ( priv->captured[0] == offset ) - return offset; - offset--; - } - return -1; -} - -/*! - Returns the length of the last matched string, or -1 if there was - no match. - - \sa exactMatch() search() searchRev() -*/ -int TQRegExp::matchedLength() const -{ - return priv->captured[1]; -} - -#ifndef TQT_NO_REGEXP_CAPTURE -/*! - Returns the number of captures contained in the regular expression. - */ -int TQRegExp::numCaptures() const -{ - prepareEngine(); - return eng->numCaptures(); -} - -/*! - Returns a list of the captured text strings. - - The first string in the list is the entire matched string. Each - subsequent list element contains a string that matched a - (capturing) subexpression of the regexp. - - For example: - \code - TQRegExp rx( "(\\d+)(\\s*)(cm|inch(es)?)" ); - int pos = rx.search( "Length: 36 inches" ); - TQStringList list = rx.capturedTexts(); - // list is now ( "36 inches", "36", " ", "inches", "es" ) - \endcode - - The above example also captures elements that may be present but - which we have no interest in. This problem can be solved by using - non-capturing parentheses: - - \code - TQRegExp rx( "(\\d+)(?:\\s*)(cm|inch(?:es)?)" ); - int pos = rx.search( "Length: 36 inches" ); - TQStringList list = rx.capturedTexts(); - // list is now ( "36 inches", "36", "inches" ) - \endcode - - Note that if you want to iterate over the list, you should iterate - over a copy, e.g. - \code - TQStringList list = rx.capturedTexts(); - TQStringList::Iterator it = list.begin(); - while( it != list.end() ) { - myProcessing( *it ); - ++it; - } - \endcode - - Some regexps can match an indeterminate number of times. For - example if the input string is "Offsets: 12 14 99 231 7" and the - regexp, \c{rx}, is <b>(\\d+)+</b>, we would hope to get a list of - all the numbers matched. However, after calling - \c{rx.search(str)}, capturedTexts() will return the list ( "12", - "12" ), i.e. the entire match was "12" and the first subexpression - matched was "12". The correct approach is to use cap() in a \link - #cap_in_a_loop loop \endlink. - - The order of elements in the string list is as follows. The first - element is the entire matching string. Each subsequent element - corresponds to the next capturing open left parentheses. Thus - capturedTexts()[1] is the text of the first capturing parentheses, - capturedTexts()[2] is the text of the second and so on - (corresponding to $1, $2, etc., in some other regexp languages). - - \sa cap() pos() exactMatch() search() searchRev() -*/ -TQStringList TQRegExp::capturedTexts() -{ - if ( priv->capturedCache.isEmpty() ) { - for ( int i = 0; i < (int) priv->captured.size(); i += 2 ) { - TQString m; - if ( priv->captured[i + 1] == 0 ) - m = TQString::tqfromLatin1( "" ); - else if ( priv->captured[i] >= 0 ) - m = priv->t.mid( priv->captured[i], - priv->captured[i + 1] ); - priv->capturedCache.append( m ); - } - priv->t = TQString::null; - } - return priv->capturedCache; -} - -/*! - Returns the text captured by the \a nth subexpression. The entire - match has index 0 and the parenthesized subexpressions have - indices starting from 1 (excluding non-capturing parentheses). - - \code - TQRegExp rxlen( "(\\d+)(?:\\s*)(cm|inch)" ); - int pos = rxlen.search( "Length: 189cm" ); - if ( pos > -1 ) { - TQString value = rxlen.cap( 1 ); // "189" - TQString unit = rxlen.cap( 2 ); // "cm" - // ... - } - \endcode - - The order of elements matched by cap() is as follows. The first - element, cap(0), is the entire matching string. Each subsequent - element corresponds to the next capturing open left parentheses. - Thus cap(1) is the text of the first capturing parentheses, cap(2) - is the text of the second, and so on. - - \target cap_in_a_loop - Some patterns may lead to a number of matches which cannot be - determined in advance, for example: - - \code - TQRegExp rx( "(\\d+)" ); - str = "Offsets: 12 14 99 231 7"; - TQStringList list; - pos = 0; - while ( pos >= 0 ) { - pos = rx.search( str, pos ); - if ( pos > -1 ) { - list += rx.cap( 1 ); - pos += rx.matchedLength(); - } - } - // list contains "12", "14", "99", "231", "7" - \endcode - - \sa capturedTexts() pos() exactMatch() search() searchRev() -*/ -TQString TQRegExp::cap( int nth ) -{ - if ( nth < 0 || nth >= (int) priv->captured.size() / 2 ) { - return TQString::null; - } else { - return capturedTexts()[nth]; - } -} - -/*! - Returns the position of the \a nth captured text in the searched - string. If \a nth is 0 (the default), pos() returns the position - of the whole match. - - Example: - \code - TQRegExp rx( "/([a-z]+)/([a-z]+)" ); - rx.search( "Output /dev/null" ); // returns 7 (position of /dev/null) - rx.pos( 0 ); // returns 7 (position of /dev/null) - rx.pos( 1 ); // returns 8 (position of dev) - rx.pos( 2 ); // returns 12 (position of null) - \endcode - - For zero-length matches, pos() always returns -1. (For example, if - cap(4) would return an empty string, pos(4) returns -1.) This is - due to an implementation tradeoff. - - \sa capturedTexts() exactMatch() search() searchRev() -*/ -int TQRegExp::pos( int nth ) -{ - if ( nth < 0 || nth >= (int) priv->captured.size() / 2 ) - return -1; - else - return priv->captured[2 * nth]; -} - -/*! - Returns a text string that explains why a regexp pattern is - invalid the case being; otherwise returns "no error occurred". - - \sa isValid() -*/ -TQString TQRegExp::errorString() -{ - if ( isValid() ) { - return TQString( RXERR_OK ); - } else { - return eng->errorString(); - } -} -#endif - -/*! - Returns the string \a str with every regexp special character - escaped with a backslash. The special characters are $, (, ), *, +, - ., ?, [, \, ], ^, {, | and }. - - Example: - \code - s1 = TQRegExp::escape( "bingo" ); // s1 == "bingo" - s2 = TQRegExp::escape( "f(x)" ); // s2 == "f\\(x\\)" - \endcode - - This function is useful to construct regexp patterns dynamically: - - \code - TQRegExp rx( "(" + TQRegExp::escape(name) + - "|" + TQRegExp::escape(alias) + ")" ); - \endcode -*/ -TQString TQRegExp::escape( const TQString& str ) -{ - static const char meta[] = "$()*+.?[\\]^{|}"; - TQString quoted = str; - int i = 0; - - while ( i < (int) quoted.length() ) { - if ( strchr(meta, quoted[i].latin1()) != 0 ) - quoted.insert( i++, "\\" ); - i++; - } - return quoted; -} - -void TQRegExp::prepareEngine() const -{ - if ( eng == 0 ) { -#ifndef TQT_NO_REGEXP_WILDCARD - if ( priv->wc ) - priv->rxpattern = wc2rx( priv->pattern ); - else -#endif - priv->rxpattern = priv->pattern.isNull() ? TQString::tqfromLatin1( "" ) - : priv->pattern; - TQRegExp *that = (TQRegExp *) this; - // that->eng = newEngine( priv->rxpattern, priv->cs ); - regexpEngine( that->eng, priv->rxpattern, priv->cs, FALSE ); - priv->captured.detach(); - priv->captured.fill( -1, 2 + 2 * eng->numCaptures() ); - } -} - -void TQRegExp::prepareEngineForMatch( const TQString& str ) const -{ - prepareEngine(); -#ifndef TQT_NO_REGEXP_CAPTURE - priv->t = str; - priv->capturedCache.clear(); -#else - TQ_UNUSED( str ); -#endif -} - -void TQRegExp::invalidateEngine() -{ - if ( eng != 0 ) { - regexpEngine( eng, priv->rxpattern, priv->cs, TRUE ); - priv->rxpattern = TQString(); - eng = 0; - } -} - -int TQRegExp::caretIndex( int offset, CaretMode caretMode ) -{ - if ( caretMode == CaretAtZero ) { - return 0; - } else if ( caretMode == CaretAtOffset ) { - return offset; - } else { // CaretWontMatch - return -1; - } -} - -#endif // USE_QT4 - -#endif // TQT_NO_REGEXP diff --git a/tqtinterface/qt4/src/tools/tqregexp.h b/tqtinterface/qt4/src/tools/tqregexp.h deleted file mode 100644 index 23b92a1..0000000 --- a/tqtinterface/qt4/src/tools/tqregexp.h +++ /dev/null @@ -1,181 +0,0 @@ -/**************************************************************************** -** -** Definition of TQRegExp class -** -** Created : 950126 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQREGEXP_H -#define TQREGEXP_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqstringlist.h" -#endif // TQT_H - -#ifdef USE_QT4 - -#include <Qt/qregexp.h> -#include <Qt/qstringlist.h> - -#endif // USE_QT4 - -#ifndef TQT_NO_REGEXP - -#ifdef USE_QT4 - -class TQ_EXPORT TQRegExp : public QRegExp -{ -public: - TQRegExp() : QRegExp() {} - TQRegExp( const QString& pattern, bool caseSensitive = TRUE, bool wildcard = FALSE ) : QRegExp( pattern, (Qt::CaseSensitivity)caseSensitive, (wildcard)?QRegExp::Wildcard:QRegExp::RegExp ) {} - TQRegExp( const QRegExp& rx ) : QRegExp( rx ) {} - -#if defined(TQ_TQDOC) - int search( const TQString& str, int offset = 0, CaretMode caretMode = CaretAtZero ) const; - int searchRev( const TQString& str, int offset = -1, CaretMode caretMode = CaretAtZero ) const; -#else - int search( const TQString& str, int offset = 0 ) const; - int search( const TQString& str, int offset, CaretMode caretMode ) const; - int searchRev( const TQString& str, int offset = -1 ) const; - int searchRev( const TQString& str, int offset, CaretMode caretMode ) const; -#endif - - inline TQString cap( int nth = 0 ) { return QRegExp::cap(nth); } - -#ifndef TQT_NO_COMPAT - inline int match( const TQString& str, int index = 0, int *len = 0, bool indexIsStart = TRUE ) const { - int r = search(str, index, indexIsStart?CaretAtOffset:CaretAtZero); - if (len != NULL) *len = matchedLength(); - return r; - } -#endif - - bool caseSensitive() const; - void setCaseSensitive( bool sensitive ); - -#ifndef TQT_NO_REGEXP_WILDCARD - inline bool wildcard() const { return (patternSyntax() == QRegExp::Wildcard); } - inline void setWildcard( bool wildcard ) { setPatternSyntax(wildcard ? QRegExp::Wildcard : QRegExp::RegExp); } -#endif - -#ifndef TQT_NO_REGEXP_CAPTURE - inline TQStringList tqcapturedTexts() { - QStringList ql = capturedTexts(); - TQStringList tqsl; - tqsl.clear(); - for (int i = 0; i < ql.size(); ++i) tqsl.append(ql.at(i)); - return tqsl; - } -#endif -}; - -#else // USE_QT4 - -class TQRegExpEngine; -struct TQRegExpPrivate; - -class TQ_EXPORT TQRegExp -{ -public: - enum CaretMode { CaretAtZero, CaretAtOffset, CaretWontMatch }; - - TQRegExp(); - TQRegExp( const TQString& pattern, bool caseSensitive = TRUE, - bool wildcard = FALSE ); - TQRegExp( const TQRegExp& rx ); - ~TQRegExp(); - TQRegExp& operator=( const TQRegExp& rx ); - - bool operator==( const TQRegExp& rx ) const; - bool operator!=( const TQRegExp& rx ) const { return !operator==( rx ); } - - bool isEmpty() const; - bool isValid() const; - TQString pattern() const; - void setPattern( const TQString& pattern ); - bool caseSensitive() const; - void setCaseSensitive( bool sensitive ); -#ifndef TQT_NO_REGEXP_WILDCARD - bool wildcard() const; - void setWildcard( bool wildcard ); -#endif - bool minimal() const; - void setMinimal( bool minimal ); - - bool exactMatch( const TQString& str ) const; -#ifndef TQT_NO_COMPAT - int match( const TQString& str, int index = 0, int *len = 0, - bool indexIsStart = TRUE ) const; -#endif - -#if defined(TQ_TQDOC) - int search( const TQString& str, int offset = 0, - CaretMode caretMode = CaretAtZero ) const; - int searchRev( const TQString& str, int offset = -1, - CaretMode caretMode = CaretAtZero ) const; -#else - // ### TQt 4.0: reduce these four to two functions - int search( const TQString& str, int offset = 0 ) const; - int search( const TQString& str, int offset, CaretMode caretMode ) const; - int searchRev( const TQString& str, int offset = -1 ) const; - int searchRev( const TQString& str, int offset, CaretMode caretMode ) const; -#endif - int matchedLength() const; -#ifndef TQT_NO_REGEXP_CAPTURE - int numCaptures() const; - TQStringList capturedTexts(); - TQString cap( int nth = 0 ); - int pos( int nth = 0 ); - TQString errorString(); -#endif - - static TQString escape( const TQString& str ); - -private: - void prepareEngine() const; - void prepareEngineForMatch( const TQString& str ) const; - void invalidateEngine(); - - static int caretIndex( int offset, CaretMode caretMode ); - - TQRegExpEngine *eng; - TQRegExpPrivate *priv; -}; -#endif // USE_QT4 -#endif // TQT_NO_REGEXP -#endif // TQREGEXP_H diff --git a/tqtinterface/qt4/src/tools/tqsemaphore.cpp b/tqtinterface/qt4/src/tools/tqsemaphore.cpp deleted file mode 100644 index 7f1eff9..0000000 --- a/tqtinterface/qt4/src/tools/tqsemaphore.cpp +++ /dev/null @@ -1,255 +0,0 @@ -/**************************************************************************** -** -** TQSemaphore class for Unix -** -** Created : 20010725 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#if defined(TQT_THREAD_SUPPORT) - -#include "tqsemaphore.h" -#include "tqmutex.h" -#include "tqwaitcondition.h" - - -/*! - \class TQSemaphore tqsemaphore.h - \threadsafe - \brief The TQSemaphore class provides a robust integer semaphore. - - \ingroup thread - \ingroup environment - - A TQSemaphore can be used to serialize thread execution, in a - similar way to a TQMutex. A semaphore differs from a mutex, in - that a semaphore can be accessed by more than one thread at a - time. - - For example, suppose we have an application that stores data in a - large tree structure. The application creates 10 threads - (commonly called a thread pool) to perform searches on the tree. - When the application searches the tree for some piece of data, it - uses one thread per base node to do the searching. A semaphore - could be used to make sure that two threads don't try to search - the same branch of the tree at the same time. - - A non-computing example of a semaphore would be dining at a - restuarant. A semaphore is initialized to have a maximum count - equal to the number of chairs in the restuarant. As people - arrive, they want a seat. As seats are filled, the semaphore is - accessed, once per person. As people leave, the access is - released, allowing more people to enter. If a party of 10 people - want to be seated, but there are only 9 seats, those 10 people - will wait, but a party of 4 people would be seated (taking the - available seats to 5, making the party of 10 people wait longer). - - When a semaphore is created it is given a number which is the - maximum number of concurrent accesses it will permit. Accesses to - the sempahore are gained using operator++() or operator+=(), and - released with operator--() or operator-=(). The number of - accesses allowed is retrieved with available(), and the total - number with total(). Note that the incrementing functions will - block if there aren't enough available accesses. Use tryAccess() - if you want to acquire accesses without blocking. -*/ - - -class TQSemaphorePrivate { -public: - TQSemaphorePrivate(int); - - TQMutex mutex; - TQWaitCondition cond; - - int value, max; -}; - - -TQSemaphorePrivate::TQSemaphorePrivate(int m) - : mutex(FALSE), value(0), max(m) -{ -} - - -/*! - Creates a new semaphore. The semaphore can be concurrently - accessed at most \a maxcount times. -*/ -TQSemaphore::TQSemaphore(int maxcount) -{ - d = new TQSemaphorePrivate(maxcount); -} - - -/*! - Destroys the semaphore. - - \warning If you destroy a semaphore that has accesses in use the - resultant behavior is undefined. -*/ -TQSemaphore::~TQSemaphore() -{ - delete d; -} - - -/*! - Postfix ++ operator. - - Try to get access to the semaphore. If \l available() == 0, this - call will block until it can get access, i.e. until available() \> - 0. -*/ -int TQSemaphore::operator++(int) -{ - TQMutexLocker locker(&d->mutex); - while (d->value >= d->max) - d->cond.wait(locker.mutex()); - - ++d->value; - if (d->value > d->max) - d->value = d->max; - - return d->value; -} - - -/*! - Postfix -- operator. - - Release access of the semaphore. This wakes all threads waiting - for access to the semaphore. -*/ -int TQSemaphore::operator--(int) -{ - TQMutexLocker locker(&d->mutex); - - --d->value; - if (d->value < 0) - d->value = 0; - - d->cond.wakeAll(); - - return d->value; -} - - -/*! - Try to get access to the semaphore. If \l available() \< \a n, this - call will block until it can get all the accesses it wants, i.e. - until available() \>= \a n. -*/ -int TQSemaphore::operator+=(int n) -{ - TQMutexLocker locker(&d->mutex); - - if ( n < 0 || n > d->max ) { -#ifdef TQT_CHECK_RANGE - qWarning( "TQSemaphore::operator+=: paramter %d out of range", n ); -#endif // TQT_CHECK_RANGE - n = n < 0 ? 0 : d->max; - } - - while (d->value + n > d->max) - d->cond.wait(locker.mutex()); - - d->value += n; - - return d->value; -} - - -/*! - Release \a n accesses to the semaphore. -*/ -int TQSemaphore::operator-=(int n) -{ - TQMutexLocker locker(&d->mutex); - - if ( n < 0 || n > d->value ) { -#ifdef TQT_CHECK_RANGE - qWarning( "TQSemaphore::operator-=: paramter %d out of range", n ); -#endif // TQT_CHECK_RANGE - n = n < 0 ? 0 : d->value; - } - - d->value -= n; - d->cond.wakeAll(); - - return d->value; -} - - -/*! - Returns the number of accesses currently available to the - semaphore. -*/ -int TQSemaphore::available() const -{ - TQMutexLocker locker(&d->mutex); - return d->max - d->value; -} - - -/*! - Returns the total number of accesses to the semaphore. -*/ -int TQSemaphore::total() const -{ - TQMutexLocker locker(&d->mutex); - return d->max; -} - - -/*! - Try to get access to the semaphore. If \l available() \< \a n, this - function will return FALSE immediately. If \l available() \>= \a n, - this function will take \a n accesses and return TRUE. This - function does \e not block. -*/ -bool TQSemaphore::tryAccess(int n) -{ - TQMutexLocker locker(&d->mutex); - - if (d->value + n > d->max) - return FALSE; - - d->value += n; - - return TRUE; -} - -#endif // TQT_THREAD_SUPPORT diff --git a/tqtinterface/qt4/src/tools/tqsemaphore.h b/tqtinterface/qt4/src/tools/tqsemaphore.h deleted file mode 100644 index 31e25a9..0000000 --- a/tqtinterface/qt4/src/tools/tqsemaphore.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Definition of TQSemaphore class -** -** Created : 931107 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQSEMAPHORE_H -#define TQSEMAPHORE_H - -#ifndef TQT_H -#include "tqglobal.h" -#endif // TQT_H - -#if defined(TQT_THREAD_SUPPORT) - -class TQSemaphorePrivate; - -class TQ_EXPORT TQSemaphore -{ -public: - TQSemaphore( int ); - virtual ~TQSemaphore(); - - int available() const; - int total() const; - - // postfix operators - int operator++(int); - int operator--(int); - - int operator+=(int); - int operator-=(int); - - bool tryAccess(int); - -private: - TQSemaphorePrivate *d; - -#if defined(TQ_DISABLE_COPY) - TQSemaphore(const TQSemaphore &); - TQSemaphore &operator=(const TQSemaphore &); -#endif -}; - -#endif - -#endif diff --git a/tqtinterface/qt4/src/tools/tqsettings.cpp b/tqtinterface/qt4/src/tools/tqsettings.cpp deleted file mode 100644 index d949940..0000000 --- a/tqtinterface/qt4/src/tools/tqsettings.cpp +++ /dev/null @@ -1,2105 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQSettings class -** -** Created : 000626 -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" - -// POSIX Large File Support redefines open -> open64 -static inline int qt_open( const char *pathname, int flags, mode_t mode ) -{ return ::open( pathname, flags, mode ); } -#if defined(open) -# undef open -#endif - -// POSIX Large File Support redefines truncate -> truncate64 -#if defined(truncate) -# undef truncate -#endif - -#include "tqsettings.h" - -#ifndef TQT_NO_SETTINGS - -#include "tqdir.h" -#include "tqfile.h" -#include "tqfileinfo.h" -#include "tqmap.h" -#include "tqtextstream.h" -#include "tqregexp.h" -#include <private/tqsettings_p.h> -#ifndef NO_ERRNO_H -#include <errno.h> -#endif - -/*! - \class TQSettings - \brief The TQSettings class provides persistent platform-independent application settings. - - \ingroup io - \ingroup misc - \mainclass - - On Unix systems, TQSettings uses text files to store settings. On Windows - systems, TQSettings uses the system registry. On Mac OS X, TQSettings uses - the Carbon preferences API. - - Each setting comprises an identifying key and the data associated with - the key. A key is a tqunicode string which consists of \e two or more - subkeys. A subkey is a slash, '/', followed by one or more tqunicode - characters (excluding slashes, newlines, carriage returns and equals, - '=', signs). The associated data, called the entry or value, may be a - boolean, an integer, a double, a string or a list of strings. Entry - strings may contain any tqunicode characters. - - If you want to save and restore the entire desktop's settings, i.e. - which applications are running, use TQSettings to save the settings - for each individual application and TQSessionManager to save the - desktop's session. - - Example settings: - \code - /MyCompany/MyApplication/background color - /MyCompany/MyApplication/foreground color - /MyCompany/MyApplication/tqgeometry/x - /MyCompany/MyApplication/tqgeometry/y - /MyCompany/MyApplication/tqgeometry/width - /MyCompany/MyApplication/tqgeometry/height - /MyCompany/MyApplication/recent files/1 - /MyCompany/MyApplication/recent files/2 - /MyCompany/MyApplication/recent files/3 - \endcode - Each line above is a complete key, made up of subkeys. - - A typical usage pattern for reading settings at application - startup: - \code - TQSettings settings; - settings.setPath( "MyCompany.com", "MyApplication" ); - - TQString bgColor = settings.readEntry( "/colors/background", "white" ); - int width = settings.readNumEntry( "/tqgeometry/width", 640 ); - // ... - \endcode - - A typical usage pattern for saving settings at application exit or - 'save preferences': - \code - TQSettings settings; - settings.setPath( "MyCompany.com", "MyApplication" ); - - settings.writeEntry( "/colors/background", bgColor ); - settings.writeEntry( "/tqgeometry/width", width ); - // ... - \endcode - - A key prefix can be prepended to all keys using beginGroup(). The - application of the prefix is stopped using endGroup(). For - example: - \code - TQSettings settings; - - settings.beginGroup( "/MainWindow" ); - settings.beginGroup( "/Geometry" ); - int x = settings.readEntry( "/x" ); - // ... - settings.endGroup(); - settings.beginGroup( "/Toolbars" ); - // ... - settings.endGroup(); - settings.endGroup(); - \endcode - - You can get a list of entry-holding keys by calling entryList(), and - a list of key-holding keys using subkeyList(). - - \code - TQStringList keys = settings.entryList( "/MyApplication" ); - // keys contains 'background color' and 'foreground color'. - - TQStringList keys = settings.entryList( "/MyApplication/recent files" ); - // keys contains '1', '2' and '3'. - - TQStringList subkeys = settings.subkeyList( "/MyApplication" ); - // subkeys contains 'tqgeometry' and 'recent files' - - TQStringList subkeys = settings.subkeyList( "/MyApplication/recent files" ); - // subkeys is empty. - \endcode - - Since settings for Windows are stored in the registry there are - some size limitations as follows: - \list - \i A subkey may not exceed 255 characters. - \i An entry's value may not exceed 16,300 characters. - \i All the values of a key (for example, all the 'recent files' - subkeys values), may not exceed 65,535 characters. - \endlist - - These limitations are not enforced on Unix or Mac OS X. - - \warning Creating multiple, simultaneous instances of TQSettings writing - to a text file may lead to data loss! This is a known issue which will - be fixed in a future release of TQt. - - \section1 Notes for Mac OS X Applications - - The location where settings are stored is not formally defined by - the CFPreferences API. - - At the time of writing settings are stored (either on a global or - user basis, preferring locally) into a plist file in \c - $ROOT/System/Library/Preferences (in XML format). TQSettings will - create an appropriate plist file (\c{com.<first group name>.plist}) - out of the full path to a key. - - For further information on CFPreferences see - \link http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFPreferences/index.html - Apple's Specifications\endlink - - \section1 Notes for Unix Applications - - There is no universally accepted place for storing application - settings under Unix. In the examples the settings file will be - searched for in the following directories: - \list 1 - \i \c SYSCONF - the default value is \c INSTALL/etc/settings - \i \c /opt/MyCompany/share/etc - \i \c /opt/MyCompany/share/MyApplication/etc - \i \c $HOME/.qt - \endlist - When reading settings the files are searched in the order shown - above, with later settings overriding earlier settings. Files for - which the user doesn't have read permission are ignored. When saving - settings TQSettings works in the order shown above, writing - to the first settings file for which the user has write permission. - (\c INSTALL is the directory where TQt was installed. This can be - modified by using the configure script's -prefix argument ) - - If you want to put the settings in a particular place in the - filesystem you could do this: - \code - settings.insertSearchPath( TQSettings::Unix, "/opt/MyCompany/share" ); - \endcode - - But in practice you may prefer not to use a search path for Unix. - For example the following code: - \code - settings.writeEntry( "/MyApplication/tqgeometry/width", width ); - \endcode - will end up writing the "tqgeometry/width" setting to the file - \c{$HOME/.qt/myapplicationrc} (assuming that the application is - being run by an ordinary user, i.e. not by root). - - For cross-platform applications you should ensure that the - \link #sizelimit Windows size limitations \endlink are not exceeded. - - \warning TQSettings doesn't write the settings until it is destroyed so - you should construct the TQSettings object on the stack. -*/ - -/*! - \enum TQSettings::System - - \value Mac Macintosh execution environments - \value Unix Mac OS X, Unix, Linux and Unix-like execution environments - \value Windows Windows execution environments -*/ - -/*! - \enum TQSettings::Format - - \value Native Store the settings in a platform dependent location - \value Ini Store the settings in a text file -*/ - -/*! - \enum TQSettings::Scope - - \value Global Save settings as global as possible - \value User Save settings in user space -*/ - -#if defined(TQ_OS_UNIX) -typedef int HANDLE; -#define TQ_LOCKREAD F_RDLCK -#define TQ_LOCKWRITE F_WRLCK -/* - Locks the file specified by name. The lockfile is created as a - hidden file in the same directory as the target file, with .lock - appended to the name. For example, "/etc/settings/onerc" uses a - lockfile named "/etc/settings/.onerc.lock". The type argument - controls the type of the lock, it can be either F_RDLCK for a read - lock, or F_WRLCK for a write lock. - - A file descriptor for the lock file is returned, and should be - closed with closelock() when the lock is no longer needed. - */ -static HANDLE openlock( const TQString &name, int type ) -{ - TQFileInfo info( name ); - // lockfile should be hidden, and never removed - TQString lockfile = info.dirPath() + "/." + info.fileName() + ".lock"; - - // open the lockfile - HANDLE fd = qt_open( TQFile::encodeName( lockfile ), - O_RDWR | O_CREAT, S_IRUSR | S_IWUSR ); - - if ( fd < 0 ) { - // failed to open the lock file, most likely because of permissions - return fd; - } - - struct flock fl; - fl.l_type = type; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - if ( fcntl( fd, F_SETLKW, &fl ) == -1 ) { - // the lock failed, so we should fail silently, so that people - // using filesystems that do not support locking don't see - // numerous warnings about a failed lock - close( fd ); - fd = -1; - } - - return fd; -} - -/* - Closes the lock file specified by fd. fd is the file descriptor - returned by the openlock() function. -*/ -static void closelock( HANDLE fd ) -{ - if ( fd < 0 ) { - // the lock file is not open - return; - } - - struct flock fl; - fl.l_type = F_UNLCK; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - // ignore the return value, so that the unlock fails silently - (void) fcntl( fd, F_SETLKW, &fl ); - - close( fd ); -} -#endif - - -TQSettingsGroup::TQSettingsGroup() - : modified(FALSE) -{ -} - - - - -void TQSettingsHeading::read(const TQString &filename) -{ - if (! TQFileInfo(filename).exists()) - return; - -#ifndef TQ_WS_WIN - HANDLE lockfd = openlock( filename, TQ_LOCKREAD ); -#endif - - TQFile file(filename); - if (! file.open(IO_ReadOnly)) { -#if defined(TQT_CHECK_STATE) - qWarning("TQSettings: failed to open file '%s'", filename.latin1()); -#endif - return; - } - - git = end(); - - TQTextStream stream(&file); - stream.setEncoding(TQTextStream::UnicodeUTF8); - while (! stream.atEnd()) - parseLine(stream); - - git = end(); - - file.close(); - -#ifndef TQ_WS_WIN - closelock( lockfd ); -#endif -} - - -void TQSettingsHeading::parseLine(TQTextStream &stream) -{ - TQString line = stream.readLine(); - if (line.isEmpty()) - // empty line... we'll allow it - return; - - if (line[0] == TQChar('#')) - // commented line - return; - - if (line[0] == TQChar('[')) { - TQString gname = line; - - gname = gname.remove((uint)0, 1); - if (gname[(int)gname.length() - 1] == TQChar(']')) - gname = gname.remove(gname.length() - 1, 1); - - git = find(gname); - if (git == end()) - git = replace(gname, TQSettingsGroup()); - } else { - if (git == end()) { -#if defined(TQT_CHECK_STATE) - qWarning("TQSettings: line '%s' out of group", line.latin1()); -#endif - return; - } - - int i = line.find('='); - if (i == -1) { -#if defined(TQT_CHECK_STATE) - qWarning("TQSettings: malformed line '%s' in group '%s'", - line.latin1(), git.key().latin1()); -#endif - return; - } else { - TQString key, value; - key = line.left(i); - value = ""; - bool esc=TRUE; - i++; - while (esc) { - esc = FALSE; - for ( ; i < (int)line.length(); i++ ) { - if ( esc ) { - if ( line[i] == 'n' ) - value.append('\n'); // escaped newline - else if ( line[i] == '0' ) - value = TQString::null; // escaped empty string - else - value.append(line[i]); - esc = FALSE; - } else if ( line[i] == '\\' ) - esc = TRUE; - else - value.append(line[i]); - } - if ( esc ) { - // Backwards-compatiblity... - // still escaped at EOL - manually escaped "newline" - if (stream.atEnd()) { -#if defined(TQT_CHECK_STATE) - qWarning("TQSettings: reached end of file, expected continued line"); -#endif - break; - } - value.append('\n'); - line = stream.readLine(); - i = 0; - } - } - - (*git).insert(key, value); - } - } -} - -#ifdef TQ_WS_WIN // for homedirpath reading from registry -#include "tqt_windows.h" -#include "tqlibrary.h" - -#ifndef CSIDL_APPDATA -#define CSIDL_APPDATA 0x001a // <user name>\Application Data -#endif -#ifndef CSIDL_COMMON_APPDATA -#define CSIDL_COMMON_APPDATA 0x0023 // All Users\Application Data -#endif - -#endif - -TQSettingsPrivate::TQSettingsPrivate( TQSettings::Format format ) - : groupDirty( TRUE ), modified(FALSE), globalScope(TRUE) -{ -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( format != TQSettings::Ini ) - return; -#else - TQ_UNUSED( format ); -#endif - - TQString appSettings(TQDir::homeDirPath() + "/.qt/"); - TQString defPath; -#ifdef TQ_WS_WIN -#ifdef TQ_OS_TEMP - TCHAR path[MAX_PATH]; - SHGetSpecialFolderPath( 0, path, CSIDL_APPDATA, FALSE ); - appSettings = TQString::fromUcs2( path ); - SHGetSpecialFolderPath( 0, path, CSIDL_COMMON_APPDATA, FALSE ); - defPath = TQString::fromUcs2( path ); -#else - TQLibrary library( "shell32" ); - library.setAutoUnload( FALSE ); - TQT_WA( { - typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, LPTSTR, int, BOOL); - GetSpecialFolderPath SHGetSpecialFolderPath = (GetSpecialFolderPath)library.resolve( "SHGetSpecialFolderPathW" ); - if ( SHGetSpecialFolderPath ) { - TCHAR path[MAX_PATH]; - SHGetSpecialFolderPath( 0, path, CSIDL_APPDATA, FALSE ); - appSettings = TQString::fromUcs2( (ushort*)path ); - SHGetSpecialFolderPath( 0, path, CSIDL_COMMON_APPDATA, FALSE ); - defPath = TQString::fromUcs2( (ushort*)path ); - } - } , { - typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, char*, int, BOOL); - GetSpecialFolderPath SHGetSpecialFolderPath = (GetSpecialFolderPath)library.resolve( "SHGetSpecialFolderPathA" ); - if ( SHGetSpecialFolderPath ) { - char path[MAX_PATH]; - SHGetSpecialFolderPath( 0, path, CSIDL_APPDATA, FALSE ); - appSettings = TQString::fromLocal8Bit( path ); - SHGetSpecialFolderPath( 0, path, CSIDL_COMMON_APPDATA, FALSE ); - defPath = TQString::fromLocal8Bit( path ); - } - } ); -#endif // TQ_OS_TEMP -#else - defPath = qInstallPathSysconf(); -#endif - TQDir dir(appSettings); - if (! dir.exists()) { - if (! dir.mkdir(dir.path())) -#if defined(TQT_CHECK_STATE) - qWarning("TQSettings: error creating %s", dir.path().latin1()); -#else - ; -#endif - } - - if ( !!defPath ) - searchPaths.append(defPath); - searchPaths.append(dir.path()); -} - -TQSettingsPrivate::~TQSettingsPrivate() -{ -} - -TQSettingsGroup TQSettingsPrivate::readGroup() -{ - TQSettingsHeading hd; - TQSettingsGroup grp; - - TQMap<TQString,TQSettingsHeading>::Iterator headingsit = headings.find(heading); - if (headingsit != headings.end()) - hd = *headingsit; - - TQSettingsHeading::Iterator grpit = hd.find(group); - if (grpit == hd.end()) { - TQStringList::Iterator it = searchPaths.begin(); - if ( !globalScope ) - ++it; - while (it != searchPaths.end()) { - TQString filebase = heading.lower().replace(TQRegExp(TQString::tqfromLatin1("\\s+")), "_"); - TQString fn((*it++) + "/" + filebase + "rc"); - if (! hd.contains(fn + "cached")) { - hd.read(fn); - hd.insert(fn + "cached", TQSettingsGroup()); - } - } - - headings.replace(heading, hd); - - grpit = hd.find(group); - if (grpit != hd.end()) - grp = *grpit; - } else if (hd.count() != 0) - grp = *grpit; - - return grp; -} - - -void TQSettingsPrivate::removeGroup(const TQString &key) -{ - TQSettingsHeading hd; - TQSettingsGroup grp; - bool found = FALSE; - - TQMap<TQString,TQSettingsHeading>::Iterator headingsit = headings.find(heading); - if (headingsit != headings.end()) - hd = *headingsit; - - TQSettingsHeading::Iterator grpit = hd.find(group); - if (grpit == hd.end()) { - TQStringList::Iterator it = searchPaths.begin(); - if ( !globalScope ) - ++it; - while (it != searchPaths.end()) { - TQString filebase = heading.lower().replace(TQRegExp(TQString::tqfromLatin1("\\s+")), "_"); - TQString fn((*it++) + "/" + filebase + "rc"); - if (! hd.contains(fn + "cached")) { - hd.read(fn); - hd.insert(fn + "cached", TQSettingsGroup()); - } - } - - headings.replace(heading, hd); - - grpit = hd.find(group); - if (grpit != hd.end()) { - found = TRUE; - grp = *grpit; - } - } else if (hd.count() != 0) { - found = TRUE; - grp = *grpit; - } - - if (found) { - grp.remove(key); - - if (grp.count() > 0) - hd.replace(group, grp); - else - hd.remove(group); - - if (hd.count() > 0) - headings.replace(heading, hd); - else - headings.remove(heading); - - modified = TRUE; - } -} - - -void TQSettingsPrivate::writeGroup(const TQString &key, const TQString &value) -{ - TQSettingsHeading hd; - TQSettingsGroup grp; - - TQMap<TQString,TQSettingsHeading>::Iterator headingsit = headings.find(heading); - if (headingsit != headings.end()) - hd = *headingsit; - - TQSettingsHeading::Iterator grpit = hd.find(group); - if (grpit == hd.end()) { - TQStringList::Iterator it = searchPaths.begin(); - if ( !globalScope ) - ++it; - while (it != searchPaths.end()) { - TQString filebase = heading.lower().replace(TQRegExp(TQString::tqfromLatin1("\\s+")), "_"); - TQString fn((*it++) + "/" + filebase + "rc"); - if (! hd.contains(fn + "cached")) { - hd.read(fn); - hd.insert(fn + "cached", TQSettingsGroup()); - } - } - - headings.replace(heading, hd); - - grpit = hd.find(group); - if (grpit != hd.end()) - grp = *grpit; - } else if (hd.count() != 0) - grp = *grpit; - - grp.modified = TRUE; - grp.replace(key, value); - hd.replace(group, grp); - headings.replace(heading, hd); - - modified = TRUE; -} - - -TQDateTime TQSettingsPrivate::modificationTime() -{ - TQSettingsHeading hd = headings[heading]; - TQSettingsGroup grp = hd[group]; - - TQDateTime datetime; - - TQStringList::Iterator it = searchPaths.begin(); - if ( !globalScope ) - ++it; - while (it != searchPaths.end()) { - TQFileInfo fi((*it++) + "/" + heading + "rc"); - if (fi.exists() && fi.lastModified() > datetime) - datetime = fi.lastModified(); - } - - return datetime; -} - -bool qt_verify_key( const TQString &key ) -{ - if ( key.isEmpty() || key[0] != '/' || key.contains( TQRegExp(TQString::tqfromLatin1("[=\\r\\n]")) ) ) - return FALSE; - return TRUE; -} - -static TQString groupKey( const TQString &group, const TQString &key ) -{ - TQString grp_key; - if ( group.isEmpty() || ( group.length() == 1 && group[0] == '/' ) ) { - // group is empty, or it contains a single '/', so we just return the key - if ( key.startsWith( "/" ) ) - grp_key = key; - else - grp_key = "/" + key; - } else if ( group.endsWith( "/" ) || key.startsWith( "/" ) ) { - grp_key = group + key; - } else { - grp_key = group + "/" + key; - } - return grp_key; -} - -/*! - Inserts \a path into the settings search path. The semantics of \a - path depends on the system \a s. It is usually easier and better to - use setPath() instead of this function. - - When \a s is \e Windows and the execution environment is \e not - Windows the function does nothing. Similarly when \a s is \e Unix and - the execution environment is \e not Unix the function does nothing. - - When \a s is \e Windows, and the execution environment is Windows, the - search path list will be used as the first subfolder of the "Software" - folder in the registry. - - When reading settings the folders are searched forwards from the - first folder (listed below) to the last, returning the first - settings found, and ignoring any folders for which the user doesn't - have read permission. - \list 1 - \i HKEY_CURRENT_USER/Software/MyCompany/MyApplication - \i HKEY_LOCAL_MACHINE/Software/MyCompany/MyApplication - \i HKEY_CURRENT_USER/Software/MyApplication - \i HKEY_LOCAL_MACHINE/Software/MyApplication - \endlist - - \code - TQSettings settings; - settings.insertSearchPath( TQSettings::Windows, "/MyCompany" ); - settings.writeEntry( "/MyApplication/Tip of the day", TRUE ); - \endcode - The code above will write the subkey "Tip of the day" into the \e - first of the registry folders listed below that is found and for - which the user has write permission. - \list 1 - \i HKEY_LOCAL_MACHINE/Software/MyCompany/MyApplication - \i HKEY_CURRENT_USER/Software/MyCompany/MyApplication - \i HKEY_LOCAL_MACHINE/Software/MyApplication - \i HKEY_CURRENT_USER/Software/MyApplication - \endlist - If a setting is found in the HKEY_CURRENT_USER space, this setting - is overwritten independently of write permissions in the - HKEY_LOCAL_MACHINE space. - - When \a s is \e Unix, and the execution environment is Unix, the - search path list will be used when trying to determine a suitable - filename for reading and writing settings files. By default, there are - two entries in the search path: - - \list 1 - \i \c SYSCONF - where \c SYSCONF is a directory specified when - configuring TQt; by default it is INSTALL/etc/settings. - \i \c $HOME/.qt/ - where \c $HOME is the user's home directory. - \endlist - - All insertions into the search path will go before $HOME/.qt/. - For example: - \code - TQSettings settings; - settings.insertSearchPath( TQSettings::Unix, "/opt/MyCompany/share/etc" ); - settings.insertSearchPath( TQSettings::Unix, "/opt/MyCompany/share/MyApplication/etc" ); - // ... - \endcode - Will result in a search path of: - \list 1 - \i SYSCONF - \i /opt/MyCompany/share/etc - \i /opt/MyCompany/share/MyApplication/etc - \i $HOME/.qt - \endlist - When reading settings the files are searched in the order shown - above, with later settings overriding earlier settings. Files for - which the user doesn't have read permission are ignored. When saving - settings TQSettings works in the order shown above, writing - to the first settings file for which the user has write permission. - - Note that paths in the file system are not created by this - function, so they must already exist to be useful. - - Settings under Unix are stored in files whose names are based on the - first subkey of the key (not including the search path). The algorithm - for creating names is essentially: lowercase the first subkey, replace - spaces with underscores and add 'rc', e.g. - <tt>/MyCompany/MyApplication/background color</tt> will be stored in - <tt>myapplicationrc</tt> (assuming that <tt>/MyCompany</tt> is part of - the search path). - - \sa removeSearchPath() - -*/ -void TQSettings::insertSearchPath( System s, const TQString &path) -{ -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) { - d->sysInsertSearchPath( s, path ); - return; - } -#endif - -#if !defined(TQ_WS_WIN) - if ( s == Windows ) - return; -#endif -#if !defined(TQ_OS_MAC) - if ( s == Mac ) - return; -#endif - - if ( !qt_verify_key( path ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::insertSearchPath: Invalid key: '%s'", path.isNull() ? "(null)" : path.latin1() ); -#endif - return; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd && s != Unix ) { -#else - if ( s != Unix ) { -#endif -#if !defined(TQWS) && defined(TQ_OS_MAC) - if(s != Mac) //mac is respected on the mac as well -#endif - return; - } - - TQString realPath = path; -#if defined(TQ_WS_WIN) - TQString defPath = d->globalScope ? d->searchPaths.first() : d->searchPaths.last(); - realPath = defPath + path; -#endif - - TQStringList::Iterator it = d->searchPaths.find(d->searchPaths.last()); - if (it != d->searchPaths.end()) { - d->searchPaths.insert(it, realPath); - } -} - - -/*! - Removes all occurrences of \a path (using exact matching) from the - settings search path for system \a s. Note that the default search - paths cannot be removed. - - \sa insertSearchPath() -*/ -void TQSettings::removeSearchPath( System s, const TQString &path) -{ - if ( !qt_verify_key( path ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::insertSearchPath: Invalid key: '%s'", path.isNull() ? "(null)" : path.latin1() ); -#endif - return; - } - -#ifdef TQ_WS_WIN - if ( d->sysd ) { - d->sysRemoveSearchPath( s, path ); - return; - } -#endif -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd && s != Unix ) { -#else - if ( s != Unix ) { -#endif -#if !defined(TQWS) && defined(TQ_OS_MAC) - if(s != Mac) //mac is respected on the mac as well -#endif - return; - } - - if (path == d->searchPaths.first() || path == d->searchPaths.last()) - return; - - d->searchPaths.remove(path); -} - - -/*! - Creates a settings object. - - Be aware that you must call setPath() or insertSearchPath() before - you can use the TQSettings object. -*/ -TQSettings::TQSettings() -{ - d = new TQSettingsPrivate( Native ); - TQ_CHECK_PTR(d); - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - d->sysd = 0; - d->sysInit(); -#endif -} - -/*! - Creates a settings object. If \a format is 'Ini' the settings will - be stored in a text file, using the Unix strategy (see above). If \a format - is 'Native', the settings will be stored in a platform specific way - (ie. the Windows registry). - - Be aware that you must call setPath() or insertSearchPath() before - you can use the TQSettings object. -*/ -TQSettings::TQSettings( Format format ) -{ - d = new TQSettingsPrivate( format ); - TQ_CHECK_PTR(d); - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - d->sysd = 0; - if ( format == Native ) - d->sysInit(); -#else - TQ_UNUSED(format); -#endif -} - -/*! - Destroys the settings object. All modifications made to the settings - will automatically be saved. - -*/ -TQSettings::~TQSettings() -{ - sync(); - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - d->sysClear(); -#endif - - delete d; -} - - -/*! \internal - Writes all modifications to the settings to disk. If any errors are - encountered, this function returns FALSE, otherwise it will return TRUE. -*/ -bool TQSettings::sync() -{ -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysSync(); -#endif - if (! d->modified) - // fake success - return TRUE; - - bool success = TRUE; - TQMap<TQString,TQSettingsHeading>::Iterator it = d->headings.begin(); - - while (it != d->headings.end()) { - // determine filename - TQSettingsHeading hd(*it); - TQSettingsHeading::Iterator hdit = hd.begin(); - TQString filename; - - TQStringList::Iterator pit = d->searchPaths.begin(); - if ( !d->globalScope ) - ++pit; - while (pit != d->searchPaths.end()) { - TQString filebase = it.key().lower().replace(TQRegExp(TQString::tqfromLatin1("\\s+")), "_"); - TQFileInfo di(*pit); - if ( !di.exists() ) { - TQDir dir; - dir.mkdir( *pit ); - } - - TQFileInfo fi((*pit++) + "/" + filebase + "rc"); - - if ((fi.exists() && fi.isFile() && fi.isWritable()) || - (! fi.exists() && di.isDir() -#ifndef TQ_WS_WIN - && di.isWritable() -#else - && ((qWinVersion()&TQt::WV_NT_based) > TQt::WV_2000 || di.isWritable()) -#endif - )) { - filename = fi.filePath(); - break; - } - } - - ++it; - - if ( filename.isEmpty() ) { - -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::sync: filename is null/empty"); -#endif // TQT_CHECK_STATE - - success = FALSE; - continue; - } - -#ifndef TQ_WS_WIN - HANDLE lockfd = openlock( filename, TQ_LOCKWRITE ); -#endif - - TQFile file( filename + ".tmp" ); - if (! file.open(IO_WriteOnly)) { - -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::sync: failed to open '%s' for writing", - file.name().latin1()); -#endif // TQT_CHECK_STATE - - success = FALSE; - continue; - } - - // spew to file - TQTextStream stream(&file); - stream.setEncoding(TQTextStream::UnicodeUTF8); - - while (hdit != hd.end()) { - if ((*hdit).count() > 0) { - stream << "[" << hdit.key() << "]" << endl; - - TQSettingsGroup grp(*hdit); - TQSettingsGroup::Iterator grpit = grp.begin(); - - while (grpit != grp.end()) { - TQString v = grpit.data(); - if ( v.isNull() ) { - v = TQString::tqfromLatin1("\\0"); // escape null string - } else { - v.replace('\\', TQString::tqfromLatin1("\\\\")); // escape backslash - v.replace('\n', TQString::tqfromLatin1("\\n")); // escape newlines - } - - stream << grpit.key() << "=" << v << endl; - ++grpit; - } - - stream << endl; - } - - ++hdit; - } - - if (file.status() != IO_Ok) { - -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::sync: error at end of write"); -#endif // TQT_CHECK_STATE - - success = FALSE; - } - - file.close(); - - if ( success ) { - TQDir dir( TQFileInfo( file ).dir( TRUE ) ); - if ( dir.exists( filename ) && !dir.remove( filename ) || - !dir.rename( file.name(), filename, TRUE ) ) { - -#ifdef TQT_CHECK_STATE - qWarning( "TQSettings::sync: error writing file '%s'", - TQFile::encodeName( filename ).data() ); -#endif // TQT_CHECK_STATE - - success = FALSE; - } - } - - // remove temporary file - file.remove(); - -#ifndef TQ_WS_WIN - closelock( lockfd ); -#endif - } - - d->modified = FALSE; - - return success; -} - - -/*! - \fn bool TQSettings::readBoolEntry(const TQString &key, bool def, bool *ok ) const - - Reads the entry specified by \a key, and returns a bool, or the - default value, \a def, if the entry couldn't be read. - If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE - otherwise. - - \sa readEntry(), readNumEntry(), readDoubleEntry(), writeEntry(), removeEntry() -*/ - -/*! - \internal -*/ -bool TQSettings::readBoolEntry(const TQString &key, bool def, bool *ok ) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::readBoolEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - if ( ok ) - *ok = FALSE; - - return def; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysReadBoolEntry( grp_key, def, ok ); -#endif - - TQString value = readEntry( key, ( def ? "true" : "false" ), ok ); - - if (value.lower() == "true") - return TRUE; - else if (value.lower() == "false") - return FALSE; - else if (value == "1") - return TRUE; - else if (value == "0") - return FALSE; - - if (! value.isEmpty()) - qWarning("TQSettings::readBoolEntry: '%s' is not 'true' or 'false'", - value.latin1()); - if ( ok ) - *ok = FALSE; - return def; -} - - -/*! - \fn double TQSettings::readDoubleEntry(const TQString &key, double def, bool *ok ) const - - Reads the entry specified by \a key, and returns a double, or the - default value, \a def, if the entry couldn't be read. - If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE - otherwise. - - \sa readEntry(), readNumEntry(), readBoolEntry(), writeEntry(), removeEntry() -*/ - -/*! - \internal -*/ -double TQSettings::readDoubleEntry(const TQString &key, double def, bool *ok ) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::readDoubleEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - if ( ok ) - *ok = FALSE; - - return def; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysReadDoubleEntry( grp_key, def, ok ); -#endif - - TQString value = readEntry( key, TQString::number(def), ok ); - bool conv_ok; - double retval = value.toDouble( &conv_ok ); - if ( conv_ok ) - return retval; - if ( ! value.isEmpty() ) - qWarning( "TQSettings::readDoubleEntry: '%s' is not a number", - value.latin1() ); - if ( ok ) - *ok = FALSE; - return def; -} - - -/*! - \fn int TQSettings::readNumEntry(const TQString &key, int def, bool *ok ) const - - Reads the entry specified by \a key, and returns an integer, or the - default value, \a def, if the entry couldn't be read. - If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE - otherwise. - - \sa readEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry() -*/ - -/*! - \internal -*/ -int TQSettings::readNumEntry(const TQString &key, int def, bool *ok ) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::readNumEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - if ( ok ) - *ok = FALSE; - return def; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysReadNumEntry( grp_key, def, ok ); -#endif - - TQString value = readEntry( key, TQString::number( def ), ok ); - bool conv_ok; - int retval = value.toInt( &conv_ok ); - if ( conv_ok ) - return retval; - if ( ! value.isEmpty() ) - qWarning( "TQSettings::readNumEntry: '%s' is not a number", - value.latin1() ); - if ( ok ) - *ok = FALSE; - return def; -} - - -/*! - \fn TQString TQSettings::readEntry(const TQString &key, const TQString &def, bool *ok ) const - - Reads the entry specified by \a key, and returns a TQString, or the - default value, \a def, if the entry couldn't be read. - If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE - otherwise. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry() -*/ - -/*! - \internal -*/ -TQString TQSettings::readEntry(const TQString &key, const TQString &def, bool *ok ) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::readEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - if ( ok ) - *ok = FALSE; - - return def; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysReadEntry( grp_key, def, ok ); -#endif - - if ( ok ) // no, everything is not ok - *ok = FALSE; - - TQString realkey; - - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 2) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::readEntry: invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - if ( ok ) - *ok = FALSE; - return def; - } - - if (list.count() == 2) { - d->heading = list[0]; - d->group = "General"; - realkey = list[1]; - } else { - d->heading = list[0]; - d->group = list[1]; - - // remove the group from the list - list.remove(list.at(1)); - // remove the heading from the list - list.remove(list.at(0)); - - realkey = list.join("/"); - } - } else { - realkey = grp_key; - } - - TQSettingsGroup grp = d->readGroup(); - TQSettingsGroup::const_iterator it = grp.find( realkey ), end = grp.end(); - TQString retval = def; - if ( it != end ) { - // found the value we needed - retval = *it; - if ( ok ) *ok = TRUE; - } - return retval; -} - - -#if !defined(TQ_NO_BOOL_TYPE) -/*! - Writes the boolean entry \a value into key \a key. The \a key is - created if it doesn't exist. Any previous value is overwritten by \a - value. - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise TRUE is returned. - - \warning On certain platforms, keys are required to contain at least - two components (e.g., "/foo/bar"). This limitation does not apply to - TQt 4. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, bool value) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::writeEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return FALSE; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysWriteEntry( grp_key, value ); -#endif - TQString s(value ? "true" : "false"); - return writeEntry(key, s); -} -#endif - - -/*! - \overload - Writes the double entry \a value into key \a key. The \a key is - created if it doesn't exist. Any previous value is overwritten by \a - value. - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise TRUE is returned. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, double value) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::writeEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return FALSE; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysWriteEntry( grp_key, value ); -#endif - TQString s(TQString::number(value)); - return writeEntry(key, s); -} - - -/*! - \overload - Writes the integer entry \a value into key \a key. The \a key is - created if it doesn't exist. Any previous value is overwritten by \a - value. - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise TRUE is returned. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, int value) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::writeEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return FALSE; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysWriteEntry( grp_key, value ); -#endif - TQString s(TQString::number(value)); - return writeEntry(key, s); -} - - -/*! - \internal - - Writes the entry specified by \a key with the string-literal \a value, - replacing any previous setting. If \a value is zero-length or null, the - entry is replaced by an empty setting. - - \e NOTE: This function is provided because some compilers use the - writeEntry (const TQString &, bool) overload for this code: - writeEntry ("/foo/bar", "baz") - - If an error occurs, this functions returns FALSE and the object is left - unchanged. - - \sa readEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, const char *value) -{ - return writeEntry(key, TQString(value)); -} - - -/*! - \overload - Writes the string entry \a value into key \a key. The \a key is - created if it doesn't exist. Any previous value is overwritten by \a - value. If \a value is an empty string or a null string the key's - value will be an empty string. - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise TRUE is returned. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, const TQString &value) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::writeEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return FALSE; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysWriteEntry( grp_key, value ); -#endif - // NOTE: we *do* allow value to be a null/empty string - - TQString realkey; - - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 2) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::writeEntry: invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - - return FALSE; - } - - if (list.count() == 2) { - d->heading = list[0]; - d->group = "General"; - realkey = list[1]; - } else { - d->heading = list[0]; - d->group = list[1]; - - // remove the group from the list - list.remove(list.at(1)); - // remove the heading from the list - list.remove(list.at(0)); - - realkey = list.join("/"); - } - } else { - realkey = grp_key; - } - - d->writeGroup(realkey, value); - return TRUE; -} - - -/*! - Removes the entry specified by \a key. - - Returns true if the entry was successfully removed; otherwise - returns false. Note that removing the last entry in any given - folder, will also remove the folder. - - \sa readEntry(), writeEntry() -*/ -bool TQSettings::removeEntry(const TQString &key) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::removeEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return FALSE; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysRemoveEntry( grp_key ); -#endif - - TQString realkey; - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 2) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::removeEntry: invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - - return FALSE; - } - - if (list.count() == 2) { - d->heading = list[0]; - d->group = "General"; - realkey = list[1]; - } else { - d->heading = list[0]; - d->group = list[1]; - - // remove the group from the list - list.remove(list.at(1)); - // remove the heading from the list - list.remove(list.at(0)); - - realkey = list.join("/"); - } - } else { - realkey = grp_key; - } - - d->removeGroup(realkey); - return TRUE; -} - - -/*! - Returns a list of the keys which contain entries under \a key. Does \e - not return any keys that contain subkeys. - - Example settings: - \code - /MyCompany/MyApplication/background color - /MyCompany/MyApplication/foreground color - /MyCompany/MyApplication/tqgeometry/x - /MyCompany/MyApplication/tqgeometry/y - /MyCompany/MyApplication/tqgeometry/width - /MyCompany/MyApplication/tqgeometry/height - \endcode - \code - TQStringList keys = settings.entryList( "/MyCompany/MyApplication" ); - \endcode - - In the above example, \c keys will contain 'background color' and - 'foreground color'. It will not contain 'tqgeometry' because this key - contains subkeys not entries. - - To access the tqgeometry values, you could either use subkeyList() - to read the keys then read each entry, or simply read each entry - directly by specifying its full key, e.g. - "/MyCompany/MyApplication/tqgeometry/y". - - \sa subkeyList() -*/ -TQStringList TQSettings::entryList(const TQString &key) const -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::entryList: Invalid key: %s", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return TQStringList(); - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysEntryList( grp_key ); -#endif - - TQString realkey; - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 1) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::listEntries: invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - - return TQStringList(); - } - - if (list.count() == 1) { - d->heading = list[0]; - d->group = "General"; - } else { - d->heading = list[0]; - d->group = list[1]; - - // remove the group from the list - list.remove(list.at(1)); - // remove the heading from the list - list.remove(list.at(0)); - - realkey = list.join("/"); - } - } else - realkey = grp_key; - - TQSettingsGroup grp = d->readGroup(); - TQSettingsGroup::Iterator it = grp.begin(); - TQStringList ret; - TQString itkey; - while (it != grp.end()) { - itkey = it.key(); - ++it; - - if ( realkey.length() > 0 ) { - if ( itkey.left( realkey.length() ) != realkey ) - continue; - else - itkey.remove( 0, realkey.length() + 1 ); - } - - if ( itkey.find( '/' ) != -1 ) - continue; - - ret << itkey; - } - - return ret; -} - - -/*! - Returns a list of the keys which contain subkeys under \a key. Does \e - not return any keys that contain entries. - - Example settings: - \code - /MyCompany/MyApplication/background color - /MyCompany/MyApplication/foreground color - /MyCompany/MyApplication/tqgeometry/x - /MyCompany/MyApplication/tqgeometry/y - /MyCompany/MyApplication/tqgeometry/width - /MyCompany/MyApplication/tqgeometry/height - /MyCompany/MyApplication/recent files/1 - /MyCompany/MyApplication/recent files/2 - /MyCompany/MyApplication/recent files/3 - \endcode - \code - TQStringList keys = settings.subkeyList( "/MyCompany/MyApplication" ); - \endcode - - In the above example, \c keys will contain 'tqgeometry' and - 'recent files'. It will not contain 'background color' or - 'foreground color' because those keys contain entries not - subkeys. To get a list of keys that contain entries rather than - subkeys use entryList() instead. - - \warning In the above example, if TQSettings is writing to an Ini file, - then a call to - \code subkeyList("/MyCompany") \endcode - will return an empty list. This happens because a key like - \code /MyCompany/MyApplication/background color \endcode - is written to the file \e{"mycompanyrc"}, under the section \e{[MyApplication]}. - This call is therefore a request to list the sections in an ini file, which - is not supported in this version of TQSettings. This is a known issue which - will be fixed in TQt-4. - - \sa entryList() -*/ -TQStringList TQSettings::subkeyList(const TQString &key) const -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::subkeyList: Invalid key: %s", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return TQStringList(); - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysSubkeyList( grp_key ); -#endif - - TQString realkey; - int subkeycount = 2; - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 1) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::subkeyList: invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - - return TQStringList(); - } - - subkeycount = (int)list.count(); - - if (list.count() == 1) { - d->heading = list[0]; - d->group = "General"; - } else { - d->heading = list[0]; - d->group = list[1]; - - // remove the group from the list - list.remove(list.at(1)); - // remove the heading from the list - list.remove(list.at(0)); - - realkey = list.join("/"); - } - - } else - realkey = grp_key; - - TQStringList ret; - if ( subkeycount == 1 ) { - TQMap<TQString,TQSettingsHeading>::Iterator it = d->headings.begin(); - while ( it != d->headings.end() ) { - if ( it.key() != "General" && ! ret.contains( it.key() ) ) - ret << it.key(); - ++it; - } - - return ret; - } - - TQSettingsGroup grp = d->readGroup(); - TQSettingsGroup::Iterator it = grp.begin(); - TQString itkey; - while (it != grp.end()) { - itkey = it.key(); - ++it; - - if ( realkey.length() > 0 ) { - if ( itkey.left( realkey.length() ) != realkey - || itkey.length()+1 < realkey.length() - || itkey[(int)realkey.length()] != '/') - continue; - else - itkey.remove( 0, realkey.length() + 1 ); - } - - int slash = itkey.find( '/' ); - if ( slash == -1 ) - continue; - itkey.truncate( slash ); - - if ( ! ret.contains( itkey ) ) - ret << itkey; - } - - return ret; -} - - -/*! - \internal - - This function returns the time of last modification for \a key. -*/ -TQDateTime TQSettings::lastModificationTime( const TQString &key ) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::lastModificationTime: Invalid key '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return TQDateTime(); - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return TQDateTime(); -#endif - - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 2) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::lastModificationTime: Invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - - return TQDateTime(); - } - - if (list.count() == 2) { - d->heading = list[0]; - d->group = "General"; - } else { - d->heading = list[0]; - d->group = list[1]; - } - } - - return d->modificationTime(); -} - - -/*! - \overload - \obsolete - - Writes the string list entry \a value into key \a key. The \a key - is created if it doesn't exist. Any previous value is overwritten - by \a value. The list is stored as a sequence of strings separated - by \a separator (using TQStringList::join()), so none of the - strings in the list should contain the separator. If the list is - empty or null the key's value will be an empty string. - - \warning The list should not contain empty or null strings, as - readListEntry() will use TQStringList::split() to recreate the - list. As the documentation states, TQStringList::split() will omit - empty strings from the list. Because of this, it is impossible to - retrieve identical list data that is stored with this function. - We recommend using the writeEntry() and readListEntry() overloads - that do not take a \a separator argument. - - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise returns TRUE. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry(), TQStringList::join() -*/ -bool TQSettings::writeEntry(const TQString &key, const TQStringList &value, - const TQChar &separator) -{ - TQString s(value.join(separator)); - return writeEntry(key, s); -} - -/*! - \overload - - Writes the string list entry \a value into key \a key. The \a key - is created if it doesn't exist. Any previous value is overwritten - by \a value. - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise returns TRUE. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, const TQStringList &value) -{ - TQString s; - for (TQStringList::ConstIterator it=value.begin(); it!=value.end(); ++it) { - TQString el = *it; - if ( el.isNull() ) { - el = "^0"; - } else { - el.replace("^", "^^"); - } - s+=el; - s+="^e"; // end of element - } - return writeEntry(key, s); -} - - -/*! - \overload TQStringList TQSettings::readListEntry(const TQString &key, const TQChar &separator, bool *ok ) const - \obsolete - - Reads the entry specified by \a key as a string. The \a separator - is used to create a TQStringList by calling TQStringList::split(\a - separator, entry). If \a ok is not 0: \a *ok is set to TRUE - if the key was read, otherwise \a *ok is set to FALSE. - - \warning As the documentation states, TQStringList::split() will - omit empty strings from the list. Because of this, it is - impossible to retrieve identical list data with this function. We - recommend using the readListEntry() and writeEntry() overloads - that do not take a \a separator argument. - - Note that if you want to iterate over the list, you should iterate - over a copy, e.g. - \code - TQStringList list = mySettings.readListEntry( "size", " " ); - TQStringList::Iterator it = list.begin(); - while( it != list.end() ) { - myProcessing( *it ); - ++it; - } - \endcode - - \sa readEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry(), TQStringList::split() -*/ - -/*! - \internal -*/ -TQStringList TQSettings::readListEntry(const TQString &key, const TQChar &separator, bool *ok ) -{ - TQString value = readEntry( key, TQString::null, ok ); - if ( ok && !*ok ) - return TQStringList(); - - return TQStringList::split(separator, value); -} - -/*! - \fn TQStringList TQSettings::readListEntry(const TQString &key, bool *ok ) const - Reads the entry specified by \a key as a string. If \a ok is not - 0, \a *ok is set to TRUE if the key was read, otherwise \a *ok is - set to FALSE. - - Note that if you want to iterate over the list, you should iterate - over a copy, e.g. - \code - TQStringList list = mySettings.readListEntry( "recentfiles" ); - TQStringList::Iterator it = list.begin(); - while( it != list.end() ) { - myProcessing( *it ); - ++it; - } - \endcode - - \sa readEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry(), TQStringList::split() -*/ - -/*! - \internal -*/ -TQStringList TQSettings::readListEntry(const TQString &key, bool *ok ) -{ - TQString value = readEntry( key, TQString::null, ok ); - if ( ok && !*ok ) - return TQStringList(); - TQStringList l; - TQString s; - bool esc=FALSE; - for (int i=0; i<(int)value.length(); i++) { - if ( esc ) { - if ( value[i] == 'e' ) { // end-of-string - l.append(s); - s=""; - } else if ( value[i] == '0' ) { // null string - s=TQString::null; - } else { - s.append(value[i]); - } - esc=FALSE; - } else if ( value[i] == '^' ) { - esc = TRUE; - } else { - s.append(value[i]); - if ( i == (int)value.length()-1 ) - l.append(s); - } - } - return l; -} - -#ifdef TQ_OS_MAC -void qt_setSettingsBasePath(const TQString &); //qsettings_mac.cpp -#endif - -/*! - Insert platform-dependent paths from platform-independent information. - - The \a domain should be an Internet domain name - controlled by the producer of the software, eg. Trolltech products - use "trolltech.com". - - The \a product should be the official name of the product. - - The \a scope should be - TQSettings::User for user-specific settings, or - TQSettings::Global for system-wide settings (generally - these will be read-only to many users). - - Not all information is relevant on all systems. -*/ - -void TQSettings::setPath( const TQString &domain, const TQString &product, Scope scope ) -{ -// On Windows, any trailing ".com(\..*)" is stripped from the domain. The -// Global scope corresponds to HKEY_LOCAL_MACHINE, and User corresponds to -// HKEY_CURRENT_USER. Note that on some installations, not all users can -// write to the Global scope. On UNIX, any trailing ".com(\..*)" is stripped -// from the domain. The Global scope corresponds to "/opt" (this would be -// configurable at library build time - eg. to "/usr/local" or "/usr"), -// while the User scope corresponds to $HOME/.*rc. -// Note that on most installations, not all users can write to the System -// scope. -// -// On MacOS X, if there is no "." in domain, append ".com", then reverse the -// order of the elements (Mac OS uses "com.apple.finder" as domain+product). -// The Global scope corresponds to /Library/Preferences/*.plist, while the -// User scope corresponds to ~/Library/Preferences/*.plist. -// Note that on most installations, not all users can write to the System -// scope. - d->globalScope = scope == Global; - - TQString actualSearchPath; - int lastDot = domain.findRev( '.' ); - -#if defined(TQ_WS_WIN) - actualSearchPath = "/" + domain.mid( 0, lastDot ) + "/" + product; - insertSearchPath( Windows, actualSearchPath ); -#elif !defined(TQWS) && defined(TQ_OS_MAC) - if(lastDot != -1) { - TQString topLevelDomain = domain.right( domain.length() - lastDot - 1 ) + "."; - if ( !topLevelDomain.isEmpty() ) - qt_setSettingsBasePath( topLevelDomain ); - } - actualSearchPath = "/" + domain.left( lastDot ) + "." + product; - insertSearchPath( Mac, actualSearchPath ); -#else - if (scope == User) - actualSearchPath = TQDir::homeDirPath() + "/."; - else - actualSearchPath = TQString(qInstallPathSysconf()) + "/"; - actualSearchPath += domain.mid( 0, lastDot ) + "/" + product; - insertSearchPath( Unix, actualSearchPath ); -#endif -} - -/*! - Appends \a group to the current key prefix. - - \code - TQSettings settings; - settings.beginGroup( "/MainWindow" ); - // read values - settings.endGroup(); - \endcode -*/ -void TQSettings::beginGroup( const TQString &group ) -{ - d->groupStack.push( group ); - d->groupDirty = TRUE; -} - -/*! - Undo previous calls to beginGroup(). Note that a single beginGroup("a/b/c") is undone - by a single call to endGroup(). - - \code - TQSettings settings; - settings.beginGroup( "/MainWindow/Geometry" ); - // read values - settings.endGroup(); - \endcode -*/ -void TQSettings::endGroup() -{ - d->groupStack.pop(); - d->groupDirty = TRUE; -} - -/*! - Set the current key prefix to the empty string. -*/ -void TQSettings::resetGroup() -{ - d->groupStack.clear(); - d->groupDirty = FALSE; - d->groupPrefix = TQString::null; -} - -/*! - Returns the current key prefix, or a null string if there is no key prefix set. - - \sa beginGroup(); -*/ -TQString TQSettings::group() const -{ - if ( d->groupDirty ) { - d->groupDirty = FALSE; - d->groupPrefix = TQString::null; - - TQValueStack<TQString>::Iterator it = d->groupStack.begin(); - while ( it != d->groupStack.end() ) { - TQString group = *it; - ++it; - if ( group[0] != '/' ) - group.prepend( "/" ); - d->groupPrefix += group; - } - } - return d->groupPrefix; -} - -#endif diff --git a/tqtinterface/qt4/src/tools/tqsettings.h b/tqtinterface/qt4/src/tools/tqsettings.h deleted file mode 100644 index e7eb2a3..0000000 --- a/tqtinterface/qt4/src/tools/tqsettings.h +++ /dev/null @@ -1,159 +0,0 @@ -/**************************************************************************** -** -** Definition of TQSettings class -** -** Created : 000626 -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQSETTINGS_H -#define TQSETTINGS_H - -#ifndef TQT_H -#include "tqdatetime.h" -#include "tqstringlist.h" -#endif // TQT_H - -#ifndef TQT_NO_SETTINGS - -class TQSettingsPrivate; - - -class TQ_EXPORT TQSettings -{ -public: - enum Format { - Native = 0, - Ini - }; - enum System { - Unix = 0, - Windows, - Mac - }; - enum Scope { - User, - Global - }; - - TQSettings(); - TQSettings( Format format ); - - ~TQSettings(); - -#if !defined(TQ_NO_BOOL_TYPE) - bool writeEntry( const TQString &, bool ); -#endif - bool writeEntry( const TQString &, double ); - bool writeEntry( const TQString &, int ); - bool writeEntry( const TQString &, const char * ); - bool writeEntry( const TQString &, const TQString & ); - bool writeEntry( const TQString &, const TQStringList & ); - bool writeEntry( const TQString &, const TQStringList &, const TQChar& sep ); - - TQStringList entryList(const TQString &) const; - TQStringList subkeyList(const TQString &) const; - - //### remove non const versions in 4.0 - TQStringList readListEntry( const TQString &, bool * = 0 ); - TQStringList readListEntry( const TQString &, const TQChar& sep, bool * = 0 ); - TQString readEntry( const TQString &, const TQString &def = TQString::null, bool * = 0 ); - int readNumEntry( const TQString &, int def = 0, bool * = 0 ); - double readDoubleEntry( const TQString &, double def = 0, bool * = 0 ); - bool readBoolEntry( const TQString &, bool def = FALSE, bool * = 0 ); - - //### make those non-inlined in 4.0 - TQStringList readListEntry( const TQString &key, bool *ok = 0 ) const - { - TQSettings *that = (TQSettings*)this; - return that->readListEntry( key, ok ); - } - TQStringList readListEntry( const TQString &key, const TQChar& sep, bool *ok = 0 ) const - { - TQSettings *that = (TQSettings*)this; - return that->readListEntry( key, sep, ok ); - } - TQString readEntry( const TQString &key, const TQString &def = TQString::null, - bool *ok = 0 ) const - { - TQSettings *that = (TQSettings*)this; - return that->readEntry( key, def, ok ); - } - int readNumEntry( const TQString &key, int def = 0, bool *ok = 0 ) const - { - TQSettings *that = (TQSettings*)this; - return that->readNumEntry( key, def, ok ); - } - - double readDoubleEntry( const TQString &key, double def = 0, bool *ok = 0 ) const - { - TQSettings *that = (TQSettings*)this; - return that->readDoubleEntry( key, def, ok ); - } - bool readBoolEntry( const TQString &key, bool def = FALSE, bool *ok = 0 ) const - { - TQSettings *that = (TQSettings*)this; - return that->readBoolEntry( key, def, ok ); - } - - bool removeEntry( const TQString & ); - - void insertSearchPath( System, const TQString & ); - void removeSearchPath( System, const TQString & ); - - void setPath( const TQString &domain, const TQString &product, Scope = Global ); - - void beginGroup( const TQString &group ); - void endGroup(); - void resetGroup(); - TQString group() const; - - bool sync(); - -private: - TQSettingsPrivate *d; - -#if defined(TQ_DISABLE_COPY) - TQSettings(const TQSettings &); - TQSettings &operator=(const TQSettings &); -#endif - - TQDateTime lastModificationTime( const TQString & ); - - friend class TQApplication; -}; - -#endif // TQT_NO_SETTINGS -#endif // TQSETTINGS_H diff --git a/tqtinterface/qt4/src/tools/tqsettings_p.h b/tqtinterface/qt4/src/tools/tqsettings_p.h deleted file mode 100644 index 31283a1..0000000 --- a/tqtinterface/qt4/src/tools/tqsettings_p.h +++ /dev/null @@ -1,148 +0,0 @@ -/**************************************************************************** -** -** Definition of TQSettings related classes -** -** Created : 990124 -** -** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the kernel module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQSETTINGS_P_H -#define TQSETTINGS_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of TQSettings. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// -// - -#ifndef TQT_H -#include "tqstringlist.h" -#include "tqmap.h" -#include "tqvaluestack.h" -#endif // TQT_H - -#ifndef TQT_NO_SETTINGS -class TQSettingsSysPrivate; - -// TQSettingsGroup is a map of key/value pairs -class TQSettingsGroup : public TQMap<TQString,TQString> -{ -public: - TQSettingsGroup(); - - bool modified; -}; - -// TQSettingsHeading is a map of heading/group pairs -class TQSettingsHeading : public TQMap<TQString,TQSettingsGroup> -{ -public: - TQSettingsHeading::Iterator git; - void read(const TQString &); - void parseLine(TQTextStream &); -}; - - -class TQSettingsPrivate -{ -public: - TQSettingsPrivate( TQSettings::Format format ); - ~TQSettingsPrivate(); - - TQSettingsGroup readGroup(); - void removeGroup(const TQString &); - void writeGroup(const TQString &, const TQString &); - TQDateTime modificationTime(); - - TQStringList searchPaths; - TQMap<TQString,TQSettingsHeading> headings; - TQString group; - TQString heading; - - /*### static data brings threading trouble - static TQString *defProduct; - static TQString *defDomain; - */ - TQValueStack<TQString> groupStack; - TQString groupPrefix; - - bool groupDirty :1; - bool modified :1; - bool globalScope :1; - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - // system dependent implementations to use the - // system specific setting database (ie. registry on Windows) - - TQSettingsSysPrivate *sysd; - void sysInit(); - void sysClear(); - -#if !defined(TQ_NO_BOOL_TYPE) - bool sysWriteEntry( const TQString &, bool ); -#endif - bool sysWriteEntry( const TQString &, double ); - bool sysWriteEntry( const TQString &, int ); - bool sysWriteEntry( const TQString &, const TQString & ); - bool sysWriteEntry( const TQString &, const TQStringList & ); - bool sysWriteEntry( const TQString &, const TQStringList &, const TQChar& sep ); - - TQStringList sysEntryList(const TQString &) const; - TQStringList sysSubkeyList(const TQString &) const; - - TQStringList sysReadListEntry( const TQString &, bool * = 0 ) const; - TQStringList sysReadListEntry( const TQString &, const TQChar& sep, bool * = 0 ) const; - TQString sysReadEntry( const TQString &, const TQString &def = TQString::null, bool * = 0 ) const; - int sysReadNumEntry( const TQString &, int def = 0, bool * = 0 ) const; - double sysReadDoubleEntry( const TQString &, double def = 0, bool * = 0 ) const; - bool sysReadBoolEntry( const TQString &, bool def = 0, bool * = 0 ) const; - - bool sysRemoveEntry( const TQString & ); - - bool sysSync(); - - void sysInsertSearchPath( TQSettings::System, const TQString & ); - void sysRemoveSearchPath( TQSettings::System, const TQString & ); -#endif - -}; -#endif //TQT_NO_SETTINGS -#endif // TQSETTINGS_P_H diff --git a/tqtinterface/qt4/src/tools/tqshared.h b/tqtinterface/qt4/src/tools/tqshared.h deleted file mode 100644 index 918af3c..0000000 --- a/tqtinterface/qt4/src/tools/tqshared.h +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** -** -** Definition of TQShared struct -** -** Created : 940112 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQSHARED_H -#define TQSHARED_H - -#ifndef TQT_H -#include "tqglobal.h" -#endif // TQT_H - - -struct TQ_EXPORT TQShared -{ - TQShared() : count( 1 ) { } - void ref() { count++; } - bool deref() { return !--count; } - uint count; -}; - - -#endif // TQSHARED_H diff --git a/tqtinterface/qt4/src/tools/tqsortedlist.h b/tqtinterface/qt4/src/tools/tqsortedlist.h deleted file mode 100644 index 28799f1..0000000 --- a/tqtinterface/qt4/src/tools/tqsortedlist.h +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -** -** Definition of TQSortedList template/macro class -** -** Created : 920701 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQSORTEDLIST_H -#define TQSORTEDLIST_H - -#ifndef TQT_H -#include "tqptrlist.h" -#endif // TQT_H - - -template<class type> -class TQSortedList : public TQPtrList<type> -{ -public: - TQSortedList() {} - TQSortedList( const TQSortedList<type> &l ) : TQPtrList<type>(l) {} - ~TQSortedList() { this->clear(); } - TQSortedList<type> &operator=(const TQSortedList<type> &l) - { return (TQSortedList<type>&)TQPtrList<type>::operator=(l); } - - virtual int compareItems( TQPtrCollection::Item s1, TQPtrCollection::Item s2 ) - { if ( *((type*)s1) == *((type*)s2) ) return 0; return ( *((type*)s1) < *((type*)s2) ? -1 : 1 ); } -}; - -#endif diff --git a/tqtinterface/qt4/src/tools/tqstring.cpp b/tqtinterface/qt4/src/tools/tqstring.cpp deleted file mode 100644 index c57b539..0000000 --- a/tqtinterface/qt4/src/tools/tqstring.cpp +++ /dev/null @@ -1,8493 +0,0 @@ -/**************************************************************************** -** -** Implementation of the TQString class and related Unicode functions -** -** Created : 920722 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -// Don't define it while compiling this module, or USERS of TQt will -// not be able to link. -#ifdef TQT_NO_CAST_ASCII -#undef TQT_NO_CAST_ASCII -#endif - -#include "tqstring.h" -#include "tqregexp.h" -#include "tqdatastream.h" -#ifndef TQT_NO_TEXTCODEC -#include "tqtextcodec.h" -#endif -#include "tqlocale.h" -#include "tqlocale_p.h" - -#include "tqunicodetables_p.h" -#include <limits.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#ifndef TQ_OS_TEMP -#include <locale.h> -#endif -#if defined(TQ_WS_WIN) -#include "tqt_windows.h" -#endif -#if !defined( TQT_NO_COMPONENT ) && !defined( TQT_LITE_COMPONENT ) -#include "tqcleanuphandler.h" -#endif - -#ifndef LLONG_MAX -#define LLONG_MAX TQ_INT64_C(9223372036854775807) -#endif -#ifndef LLONG_MIN -#define LLONG_MIN (-LLONG_MAX - TQ_INT64_C(1)) -#endif -#ifndef ULLONG_MAX -#define ULLONG_MAX TQ_UINT64_C(18446744073709551615) -#endif - -#ifdef USE_QT4 - -// #include <Qt/qhash.h> - -// static QHash<void *, QByteArray> *asciiCache = 0; - -TQT_STATIC_CONST_IMPL TQChar TQChar::null; -TQT_STATIC_CONST_IMPL TQChar TQChar::replacement((ushort)0xfffd); -TQT_STATIC_CONST_IMPL TQChar TQChar::byteOrderMark((ushort)0xfeff); -TQT_STATIC_CONST_IMPL TQChar TQChar::byteOrderSwapped((ushort)0xfffe); -TQT_STATIC_CONST_IMPL TQChar TQChar::nbsp((ushort)0x00a0); - -/*! - \internal -*/ -const char *TQString::ascii_helper() const -{ - // tqstring_ascii_ba must be a persistent member variable within the class instance, but NOT static. A static variable is global for ALL class instances (very bad!) - // Also, it MUST be declared mutable, otherwise a raft of "discards qualifiers" errors will pop up. - -// tqstring_ascii_ba = toAscii(); - // Get a real, TRUE copy of the data, not some stupid shared copy that will randomly invalidate my pointer at an unknown future date/time - QByteArray tempba = toAscii(); - tqstring_ascii_ba.resize(tempba.size()); - memcpy(tqstring_ascii_ba.data(), tempba.data(), tempba.size()); - return tqstring_ascii_ba.data(); -} - -/*! - \internal -*/ -const char *TQString::latin1_helper() const -{ - // tqstring_latin1_ba must be a persistent member variable within the class instance, but NOT static. A static variable is global for ALL class instances (very bad!) - // Also, it MUST be declared mutable, otherwise a raft of "discards qualifiers" errors will pop up. - - //tqstring_latin1_ba = toLatin1(); - // Get a real, TRUE copy of the data, not some stupid shared copy that will randomly invalidate my pointer at an unknown future date/time - QByteArray tempba = toLatin1(); - tqstring_latin1_ba.resize(tempba.size()); - memcpy(tqstring_latin1_ba.data(), tempba.data(), tempba.size()); - return tqstring_latin1_ba.data(); -} - -/*! - This utility function converts \a l 16-bit characters from \a uc - to ASCII, returning a '\0'-terminated string. - - The caller is responsible for deleting the resultant string with - delete[]. -*/ -char* TQString::tqunicodeToLatin1(const TQChar *uc, uint l) -{ - if (!uc) { - return 0; - } - char *a = new char[l+1]; - char *result = a; - while (l--) { - *a++ = (uc->tqunicode() > 0xff) ? '?' : (char)uc->tqunicode(); - uc++; - } - *a = '\0'; - return result; -} - -#if defined(Q_CC_MSVC) && _MSC_VER <= 1300 -const TQString::Null TQString::null; -#else -const TQString::Null TQString::null = { }; -#endif - -/***************************************************************************** - TQString stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -/*! - \relates TQString - - Writes the string \a str to the stream \a s. - - See also \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator<<( TQDataStream &s, const TQString &str ) -{ - if ( s.version() == 1 ) { - TQCString l( str.latin1() ); - s << l; - } - else { - int byteOrder = s.byteOrder(); - const TQChar* ub = str.tqunicode(); - if ( ub || s.version() < 3 ) { - static const uint auto_size = 1024; - char t[auto_size]; - char *b; - if ( str.length()*sizeof(TQChar) > auto_size ) { - b = new char[str.length()*sizeof(TQChar)]; - } else { - b = t; - } - int l = str.length(); - char *c=b; - while ( l-- ) { - if ( byteOrder == TQDataStream::BigEndian ) { - *c++ = (char)ub->row(); - *c++ = (char)ub->cell(); - } else { - *c++ = (char)ub->cell(); - *c++ = (char)ub->row(); - } - ub++; - } - s.writeBytes( b, sizeof(TQChar)*str.length() ); - if ( str.length()*sizeof(TQChar) > auto_size ) - delete [] b; - } else { - // write null marker - s << (TQ_UINT32)0xffffffff; - } - } - return s; -} - -/*! - \relates TQString - - Reads a string from the stream \a s into string \a str. - - See also \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator>>( TQDataStream &s, TQString &str ) -{ -#ifdef TQT_TQSTRING_UCS_4 -#if defined(TQ_CC_GNU) -#warning "operator>> not working properly" -#endif -#endif - if ( s.version() == 1 ) { - TQCString l; - s >> l; - str = TQString( l ); - } - else { - TQ_UINT32 bytes = 0; - s >> bytes; // read size of string - if ( bytes == 0xffffffff ) { // null string - str = TQString::null; - } else if ( bytes > 0 ) { // not empty - int byteOrder = s.byteOrder(); - str.setLength( bytes/2 ); -// TQChar* ch = str.d->tqunicode; - TQChar* ch = static_cast<TQChar*>(str.data()); - static const uint auto_size = 1024; - char t[auto_size]; - char *b; - if ( bytes > auto_size ) { - b = new char[bytes]; - } else { - b = t; - } - s.readRawBytes( b, bytes ); - int bt = bytes/2; - char *oldb = b; - while ( bt-- ) { - if ( byteOrder == TQDataStream::BigEndian ) - *ch++ = (ushort) (((ushort)b[0])<<8) | (uchar)b[1]; - else - *ch++ = (ushort) (((ushort)b[1])<<8) | (uchar)b[0]; - b += 2; - } - if ( bytes > auto_size ) - delete [] oldb; - } else { - str = ""; - } - } - return s; -} -#endif // TQT_NO_DATASTREAM - -#ifndef TQT_NO_CAST_ASCII -TQString &TQString::operatorPlusEqHelper( const char *s, uint len2 ) -{ -// if ( s ) { -// #ifndef TQT_NO_TEXTCODEC -// if ( TQTextCodec::codecForCStrings() ) -// return operator+=( fromAscii( s, len2 ) ); -// #endif -// -// uint len1 = length(); -// if ( len2 == UINT_MAX ) -// len2 = int(strlen( s )); -// if ( len2 ) { -// grow( len1 + len2 ); -// TQChar* uc = d->tqunicode + len1; -// while ( len2-- ) -// *uc++ = *s++; -// } else if ( isNull() ) { // ## just for 1.x compat: -// *this = tqfromLatin1( "" ); -// } -// } -// return *this; - - this->append(s); - return *this; -} -#endif - -/*! - \class TQCharRef tqstring.h - \reentrant - \brief The TQCharRef class is a helper class for TQString. - - \ingroup text - - When you get an object of type TQCharRef, if you can assign to it, - the assignment will apply to the character in the string from - which you got the reference. That is its whole purpose in life. - The TQCharRef becomes invalid once modifications are made to the - string: if you want to keep the character, copy it into a TQChar. - - Most of the TQChar member functions also exist in TQCharRef. - However, they are not explicitly documented here. - - \sa TQString::operator[]() TQString::at() TQChar -*/ - -/*! \fn TQString& TQString::append( const char *str ) - \overload - - Appends \a str to the string and returns a reference to the result. - - Equivalent to operator+=(). -*/ - -/*! - Appends \a str to the string and returns a reference to the string. -*/ -TQString& TQString::operator+=( const TQString &str ) -{ -// uint len1 = length(); -// uint len2 = str.length(); -// if ( len2 ) { -// if ( isEmpty() ) { -// operator=( str ); -// } else { -// grow( len1+len2 ); -// memcpy( d->tqunicode+len1, str.tqunicode(), sizeof(TQChar)*len2 ); -// } -// } else if ( isNull() && !str.isNull() ) { // ## just for 1.x compat: -// *this = tqfromLatin1( "" ); -// } -// return *this; - - this->append(str); - return *this; -} - -/*! - \overload - - Appends \a str to the string and returns a reference to the string. -*/ -#ifndef TQT_NO_CAST_ASCII -TQString& TQString::operator+=( const char *str ) -{ - // ### TQt 4: make this function inline - return operatorPlusEqHelper( str ); -} -#endif - -/*! \overload - - Appends \a c to the string and returns a reference to the string. -*/ - -TQString &TQString::operator+=( TQChar c ) -{ -// grow( length()+1 ); -// d->tqunicode[length()-1] = c; -// return *this; - - this->append(c); - return *this; -} - -/*! - \overload - - Appends \a c to the string and returns a reference to the string. -*/ - -TQString &TQString::operator+=( char c ) -{ -// #ifndef TQT_NO_TEXTCODEC -// if ( TQTextCodec::codecForCStrings() ) -// return operator+=( fromAscii( &c, 1 ) ); -// #endif -// grow( length()+1 ); -// d->tqunicode[length()-1] = c; -// return *this; - - this->append(c); - return *this; -} - -TQString &TQString::operator+=(const QStringRef &s) { - //return convertFromQString(); - return (*static_cast<TQString*>(&append(s))); -} - -TQString &TQString::operator+=(const QLatin1String &s) { - return (*static_cast<TQString*>(&append(s))); -} - -TQString &TQString::operator+=(QChar c) { - return (*static_cast<TQString*>(&append(c))); -} - -/*! - \fn TQCharRef TQString::at( uint i ) - - \overload - - The function returns a reference to the character at index \a i. - The resulting reference can then be assigned to, or used - immediately, but it will become invalid once further modifications - are made to the original string. - - If \a i is beyond the length of the string then the string is - expanded with TQChar::null. -*/ - -/* - Internal chunk of code to handle the - uncommon cases of at() above. -*/ -void TQString::subat( uint i ) -{ - uint olen = length(); - if ( i >= olen ) { - setLength( i+1 ); // i is index; i+1 is needed length - for ( uint j=olen; j<=i; j++ ) - tqat(j) = TQChar::null; - } else { - // Just be sure to detach -// real_detach(); - } -} - -/*! - \fn const TQChar* TQString::tqunicode() const - - Returns the Unicode representation of the string. The result - remains valid until the string is modified. -*/ - -/*! - Returns the string encoded in a locale-specific format. On X11, - this is the TQTextCodec::codecForLocale(). On Windows, it is a - system-defined encoding. On Mac OS X, this always uses UTF-8 as - the encoding. - - See TQTextCodec for more diverse coding/decoding of Unicode - strings. - - \sa fromLocal8Bit(), ascii(), latin1(), utf8() -*/ - -TQCString TQString::local8Bit() const -{ -#ifdef TQT_NO_TEXTCODEC - return latin1(); -#else -#ifdef TQ_WS_X11 - TQTextCodec* codec = TQTextCodec::codecForLocale(); - return codec - ? codec->fromUnicode(*this) - : TQCString(latin1()); -#endif -#if defined( TQ_WS_MACX ) - return utf8(); -#endif -#if defined( TQ_WS_MAC9 ) - return TQCString(latin1()); //I'm evil.. -#endif -#ifdef TQ_WS_WIN - return isNull() ? TQCString("") : qt_winTQString2MB( *this ); -#endif -#ifdef TQ_WS_TQWS - return utf8(); // ### if there is any 8 bit format supported? -#endif -#endif -} - -// TQCString TQString::local8Bit() const -// { -// return toLocal8Bit(); -// } - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a utf8, ignoring the rest of \a utf8. If \a len is - -1 then the length of \a utf8 is used. If \a len is bigger than - the length of \a utf8 then it will use the length of \a utf8. - - \code - TQString str = TQString::fromUtf8( "123456789", 5 ); - // str == "12345" - \endcode - - See TQTextCodec for more diverse coding/decoding of Unicode strings. -*/ -TQString TQString::fromUtf8( const char* utf8, int len ) -{ - if ( !utf8 ) - return TQString(); - TQString result = QString::fromUtf8(utf8, len); - int slen = int(strlen(utf8)); - if (result.length() > slen) { - result.truncate(slen); - } - return result; -} - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a chars, ignoring the rest of \a chars. If \a len - is -1 then the length of \a chars is used. If \a len is bigger - than the length of \a chars then it will use the length of \a - chars. - - \sa fromAscii() -*/ -TQString TQString::fromLatin1( const char* chars, int len ) -{ - if ( !chars ) - return TQString(); - TQString result = QString::fromLatin1(chars, len); - int slen = int(strlen(chars)); - if (result.length() > slen) { - result.truncate(slen); - } - return result; -} - -/*! - Returns the string encoded in UTF-8 format. - - See TQTextCodec for more diverse coding/decoding of Unicode strings. - - \sa fromUtf8(), ascii(), latin1(), local8Bit() -*/ -TQCString TQString::utf8() const -{ - int l = length(); - int rlen = l*3+1; - TQCString rstr(rlen); - uchar* cursor = (uchar*)rstr.data(); - const TQChar *ch = static_cast<const TQChar*>(data()); - for (int i=0; i < l; i++) { - uint u = ch->tqunicode(); - if ( u < 0x80 ) { - *cursor++ = (uchar)u; - } else { - if ( u < 0x0800 ) { - *cursor++ = 0xc0 | ((uchar) (u >> 6)); - } else { - if (u >= 0xd800 && u < 0xdc00 && i < l-1) { - unsigned short low = ch[1].tqunicode(); - if (low >= 0xdc00 && low < 0xe000) { - ++ch; - ++i; - u = (u - 0xd800)*0x400 + (low - 0xdc00) + 0x10000; - } - } - if (u > 0xffff) { - // if people are working in utf8, but strings are encoded in eg. latin1, the resulting - // name might be invalid utf8. This and the corresponding code in fromUtf8 takes care - // we can handle this without loosing information. This can happen with latin filenames - // and a utf8 locale under Unix. - if (u > 0x10fe00 && u < 0x10ff00) { - *cursor++ = (u - 0x10fe00); - ++ch; - continue; - } else { - *cursor++ = 0xf0 | ((uchar) (u >> 18)); - *cursor++ = 0x80 | ( ((uchar) (u >> 12)) & 0x3f); - } - } else { - *cursor++ = 0xe0 | ((uchar) (u >> 12)); - } - *cursor++ = 0x80 | ( ((uchar) (u >> 6)) & 0x3f); - } - *cursor++ = 0x80 | ((uchar) (u&0x3f)); - } - ++ch; - } - rstr.truncate( cursor - (uchar*)rstr.data() ); - return rstr; -} - -static bool tqIsUpper(char c) -{ - return c >= 'A' && c <= 'Z'; -} - -static bool tqIsDigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static char tqToLower(char c) -{ - if (c >= 'A' && c <= 'Z') - return c - 'A' + 'a'; - else - return c; -} - -struct ArgEscapeData -{ - uint min_escape; // lowest escape sequence number - uint occurrences; // number of occurences of the lowest escape - // sequence number - uint locale_occurrences; // number of occurences of the lowest escape - // sequence number which contain 'L' - uint escape_len; // total length of escape sequences which will - // be replaced -}; - -static ArgEscapeData findArgEscapes(const TQString &s) -{ - const TQChar *uc_begin = s.tqunicode(); - const TQChar *uc_end = uc_begin + s.length(); - - ArgEscapeData d; - - d.min_escape = 10; - d.occurrences = 0; - d.escape_len = 0; - d.locale_occurrences = 0; - - const TQChar *c = uc_begin; - while (c != uc_end) { - while (c != uc_end && c->tqunicode() != '%') - ++c; - - if (c == uc_end || ++c == uc_end) - break; - - bool locale_arg = FALSE; - if (c->tqunicode() == 'L') { - locale_arg = TRUE; - if (++c == uc_end) - break; - } - - if (c->tqunicode() < '0' || c->tqunicode() > '9') - continue; - - uint escape = c->tqunicode() - '0'; - ++c; - - if (escape > d.min_escape) - continue; - - if (escape < d.min_escape) { - d.min_escape = escape; - d.occurrences = 0; - d.escape_len = 0; - d.locale_occurrences = 0; - } - -#if TQT_VERSION < 0x040000 - // ### remove preprocessor in TQt 4.0 - /* Since in TQt < 4.0 only the first instance is replaced, - escape_len should hold the length of only the first escape - sequence */ - if (d.occurrences == 0) -#endif - { - ++d.occurrences; - if (locale_arg) { - ++d.locale_occurrences; - d.escape_len += 3; - } - else - d.escape_len += 2; - } - } - - return d; -} - -static TQString replaceArgEscapes(const TQString &s, const ArgEscapeData &d, int field_width, - const TQString &arg, const TQString &larg) -{ - const TQChar *uc_begin = s.tqunicode(); - const TQChar *uc_end = uc_begin + s.length(); - - uint abs_field_width = TQABS(field_width); - uint result_len = s.length() - - d.escape_len - + (d.occurrences - d.locale_occurrences) - *TQMAX(abs_field_width, arg.length()) - + d.locale_occurrences - *TQMAX(abs_field_width, larg.length()); - - TQString result; - result.setLength(result_len); - TQChar *result_buff = (TQChar*) result.tqunicode(); - - TQChar *rc = result_buff; - const TQChar *c = uc_begin; - uint repl_cnt = 0; - while (c != uc_end) { - /* We don't have to check if we run off the end of the string with c, - because as long as d.occurrences > 0 we KNOW there are valid escape - sequences. */ - - const TQChar *text_start = c; - - while (c->tqunicode() != '%') - ++c; - - const TQChar *escape_start = c++; - - bool locale_arg = FALSE; - if (c->tqunicode() == 'L') { - locale_arg = TRUE; - ++c; - } - - if (c->tqunicode() != '0' + d.min_escape) { - memcpy(rc, text_start, (c - text_start)*sizeof(TQChar)); - rc += c - text_start; - } - else { - ++c; - - memcpy(rc, text_start, (escape_start - text_start)*sizeof(TQChar)); - rc += escape_start - text_start; - - uint pad_chars; - if (locale_arg) - pad_chars = TQMAX(abs_field_width, larg.length()) - larg.length(); - else - pad_chars = TQMAX(abs_field_width, arg.length()) - arg.length(); - - if (field_width > 0) { // left padded - for (uint i = 0; i < pad_chars; ++i) -// (rc++)->tqunicode() = ' '; - *(rc++) = ' '; - } - - if (locale_arg) { - memcpy(rc, larg.tqunicode(), larg.length()*sizeof(TQChar)); - rc += larg.length(); - } - else { - memcpy(rc, arg.tqunicode(), arg.length()*sizeof(TQChar)); - rc += arg.length(); - } - - if (field_width < 0) { // right padded - for (uint i = 0; i < pad_chars; ++i) -// (rc++)->tqunicode() = ' '; - *(rc++) = ' '; - } - - if (++repl_cnt == d.occurrences) { - memcpy(rc, c, (uc_end - c)*sizeof(TQChar)); - rc += uc_end - c; - TQ_ASSERT(rc - result_buff == (int)result_len); - c = uc_end; - } - } - } - - return result; -} - -/*! - This function will return a string that replaces the lowest - numbered occurrence of \c %1, \c %2, ..., \c %9 with \a a. - - The \a fieldWidth value specifies the minimum amount of space that - \a a is padded to. A positive value will produce right-aligned - text, whereas a negative value will produce left-aligned text. - - The following example shows how we could create a 'status' string - when processing a list of files: - \code - TQString status = TQString( "Processing file %1 of %2: %3" ) - .tqarg( i ) // current file's number - .tqarg( total ) // number of files to process - .tqarg( fileName ); // current file's name - \endcode - - It is generally fine to use filenames and numbers as we have done - in the example above. But note that using tqarg() to construct - natural language sentences does not usually translate well into - other languages because sentence structure and word order often - differ between languages. - - If there is no place marker (\c %1, \c %2, etc.), a warning - message (qWarning()) is output and the result is undefined. - - \warning If any placeholder occurs more than once, the result is undefined. - -*/ -TQString TQString::tqarg( const TQString& a, int fieldWidth ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::tqarg(): Argument missing: %s, %s", latin1(), - a.latin1() ); - return *this; - } - - return replaceArgEscapes(*this, d, fieldWidth, a, a); -} - -/*! - \fn TQString TQString::tqarg( const TQString& a1, const TQString& a2 ) const - - \overload - - This is the same as str.tqarg(\a a1).tqarg(\a a2), except that - the strings are replaced in one pass. This can make a difference - if \a a1 contains e.g. \c{%1}: - - \code - TQString str( "%1 %2" ); - str.tqarg( "Hello", "world" ); // returns "Hello world" - str.tqarg( "Hello" ).tqarg( "world" ); // returns "Hello world" - - str.tqarg( "(%1)", "Hello" ); // returns "(%1) Hello" - str.tqarg( "(%1)" ).tqarg( "Hello" ); // returns "(Hello) %2" - \endcode -*/ - -/*! - \fn TQString TQString::tqarg( const TQString& a1, const TQString& a2, - const TQString& a3 ) const - \overload - - This is the same as calling str.tqarg(\a a1).tqarg(\a a2).tqarg(\a a3), - except that the strings are replaced in one pass. -*/ - -/*! - \fn TQString TQString::tqarg( const TQString& a1, const TQString& a2, - const TQString& a3, const TQString& a4 ) const - \overload - - This is the same as calling - str.tqarg(\a a1).tqarg(\a a2).tqarg(\a a3).tqarg(\a a4), - except that the strings are replaced in one pass. -*/ - -/*! - \overload - - The \a fieldWidth value specifies the minimum amount of space that - \a a is padded to. A positive value will produce a right-aligned - number, whereas a negative value will produce a left-aligned - number. - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. - - The '%' can be followed by an 'L', in which case the sequence is - replaced with a localized representation of \a a. The conversion - uses the default locale. The default locale is determined from the - system's locale settings at application startup. It can be changed - using TQLocale::setDefault(). The 'L' flag is ignored if \a base is - not 10. - - \code - TQString str; - str = TQString( "Decimal 63 is %1 in hexadecimal" ) - .tqarg( 63, 0, 16 ); - // str == "Decimal 63 is 3f in hexadecimal" - - TQLocale::setDefault(TQLocale::English, TQLocale::UnitedStates); - str = TQString( "%1 %L2 %L3" ) - .tqarg( 12345 ) - .tqarg( 12345 ) - .tqarg( 12345, 0, 16 ); - // str == "12345 12,345 3039" - \endcode -*/ -TQString TQString::tqarg( long a, int fieldWidth, int base ) const -{ - return tqarg((TQ_LLONG)a, fieldWidth, base); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::tqarg( ulong a, int fieldWidth, int base ) const -{ - return tqarg((TQ_ULLONG)a, fieldWidth, base); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::tqarg( TQ_LLONG a, int fieldWidth, int base ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::tqarg(): Argument missing: %s, %lld", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, base); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - locale_arg = locale.d->longLongToString(a, -1, base, -1, TQLocalePrivate::ThousandsGroup); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::tqarg( TQ_ULLONG a, int fieldWidth, int base ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::tqarg(): Argument missing: %s, %llu", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, base); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - locale_arg = locale.d->unsLongLongToString(a, -1, base, -1, TQLocalePrivate::ThousandsGroup); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -/*! - \fn TQString TQString::tqarg( int a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::tqarg( uint a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::tqarg( short a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::tqarg( ushort a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - - -/*! - \overload - - \a a is assumed to be in the Latin-1 character set. -*/ -TQString TQString::tqarg( char a, int fieldWidth ) const -{ - TQString c; - c += a; - return tqarg( c, fieldWidth ); -} - -/*! - \overload -*/ -TQString TQString::tqarg( TQChar a, int fieldWidth ) const -{ - TQString c; - c += a; - return tqarg( c, fieldWidth ); -} - -/*! - \overload - - \target arg-formats - - Argument \a a is formatted according to the \a fmt format specified, - which is 'g' by default and can be any of the following: - - \table - \header \i Format \i Meaning - \row \i \c e \i format as [-]9.9e[+|-]999 - \row \i \c E \i format as [-]9.9E[+|-]999 - \row \i \c f \i format as [-]9.9 - \row \i \c g \i use \c e or \c f format, whichever is the most concise - \row \i \c G \i use \c E or \c f format, whichever is the most concise - \endtable - - With 'e', 'E', and 'f', \a prec is the number of digits after the - decimal point. With 'g' and 'G', \a prec is the maximum number of - significant digits (trailing zeroes are omitted). - - \code - double d = 12.34; - TQString ds = TQString( "'E' format, precision 3, gives %1" ) - .tqarg( d, 0, 'E', 3 ); - // ds == "'E' format, precision 3, gives 1.234E+01" - \endcode - - The '%L' syntax can be used to produce localized strings. -*/ -TQString TQString::tqarg( double a, int fieldWidth, char fmt, int prec ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::tqarg(): Argument missing: %s, %g", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, fmt, prec); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - - TQLocalePrivate::DoubleForm form = TQLocalePrivate::DFDecimal; - uint flags = 0; - - if (tqIsUpper(fmt)) - flags = TQLocalePrivate::CapitalEorX; - fmt = tqToLower(fmt); - - switch (fmt) { - case 'f': - form = TQLocalePrivate::DFDecimal; - break; - case 'e': - form = TQLocalePrivate::DFExponent; - break; - case 'g': - form = TQLocalePrivate::DFSignificantDigits; - break; - default: -#if defined(TQT_CHECK_RANGE) - qWarning( "TQString::setNum: Invalid format char '%c'", fmt ); -#endif - break; - } - - flags |= TQLocalePrivate::ThousandsGroup; - - locale_arg = locale.d->doubleToString(a, prec, form, -1, flags); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -TQString TQString::tqmultiArg( int numArgs, const TQString& a1, const TQString& a2, const TQString& a3, const TQString& a4 ) const -{ - TQString result; - union { - int digitUsed[10]; - int argForDigit[10]; - }; - register const TQChar *uc = this->tqunicode(); - const TQString *args[4]; - const int len = (int) length(); - const int end = len - 1; - int lastDigit = -1; - int i; - - memset( digitUsed, 0, sizeof(digitUsed) ); - args[0] = &a1; - args[1] = &a2; - args[2] = &a3; - args[3] = &a4; - - for ( i = 0; i < end; i++ ) { - if ( uc[i] == '%' ) { - int digit = uc[i + 1].tqunicode() - '0'; - if ( digit >= 0 && digit <= 9 ) - digitUsed[digit]++; - } - } - - for ( i = 0; i < numArgs; i++ ) { - do { - ++lastDigit; - } while ( lastDigit < 10 && digitUsed[lastDigit] == 0 ); - - if ( lastDigit == 10 ) { - qWarning( "TQString::arg(): Argument missing: %s, %s", - latin1(), args[i]->latin1() ); - numArgs = i; - lastDigit = 9; - break; - } - argForDigit[lastDigit] = i; - } - - i = 0; - while ( i < len ) { - if ( uc[i] == '%' && i != end ) { - int digit = uc[i + 1].tqunicode() - '0'; - if ( digit >= 0 && digit <= lastDigit ) { - result += *args[argForDigit[digit]]; - i += 2; - continue; - } - } - result += uc[i++]; - } - return result; -} - -TQString &TQString::setAscii( const char *str, int len ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - *this = TQString::fromAscii( str, len ); - return *this; - } -#endif // TQT_NO_TEXTCODEC - return setLatin1( str, len ); -} - -TQString &TQString::setLatin1( const char *ch, int len ) { - *this = fromLatin1(ch, len); return *this; -} - -bool TQString::simpleText() const { - if ( !tqstring_issimpletext ) checkSimpleText(); - return tqstring_issimpletext; -} - -/*! \internal - */ -void TQString::checkSimpleText() const -{ - TQChar *p = const_cast<TQChar*>(tqunicode()); - TQChar *end = p + length(); - while ( p < end ) { - ushort uc = p->tqunicode(); - // sort out regions of complex text formatting - if ( uc > 0x058f && ( uc < 0x1100 || uc > 0xfb0f ) ) { - tqstring_issimpletext = FALSE; - return; - } - p++; - } - tqstring_issimpletext = TRUE; -} - -/*! - Resizes the string to \a len characters and copies \a - tqunicode_as_ushorts into the string (on some X11 client platforms - this will involve a byte-swapping pass). - - If \a tqunicode_as_ushorts is 0, nothing is copied, but the string - is still resized to \a len. If \a len is zero, the string becomes - a \link isNull() null\endlink string. - - \sa setLatin1(), isNull() -*/ -TQString TQString::setUnicodeCodes( const ushort* tqunicode_as_ushorts, uint len ) -{ - return TQString(setUnicode((const TQChar*)tqunicode_as_ushorts, len)); -} - -/*! - Returns the string converted to a \c double value. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - \code - TQString string( "1234.56" ); - double a = string.toDouble(); // a == 1234.56 - \endcode - - The string-to-number functions: - \list - \i toShort() - \i toUShort() - \i toInt() - \i toUInt() - \i toLong() - \i toULong() - \i toLongLong() - \i toULongLong() - \i toFloat() - \i toDouble() - \endlist - can handle numbers - represented in various locales. These representations may use different - characters for the decimal point, thousands group sepearator - and even individual digits. TQString's functions try to interpret - the string according to the current locale. The current locale is - determined from the system at application startup and can be changed - by calling TQLocale::setDefault(). If the string cannot be interpreted - according to the current locale, this function falls back - on the "C" locale. - - \code - bool ok; - double d; - - TQLocale::setDefault(TQLocale::C); - d = TQString( "1234,56" ).toDouble(&ok); // ok == false - d = TQString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56 - - TQLocale::setDefault(TQLocale::German); - d = TQString( "1234,56" ).toDouble(&ok); // ok == true, d == 1234.56 - d = TQString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56 - \endcode - - Due to the ambiguity between the decimal point and thousands group - separator in various locales, these functions do not handle - thousands group separators. If you need to convert such numbers, - use the corresponding function in TQLocale. - - \code - bool ok; - TQLocale::setDefault(TQLocale::C); - double d = TQString( "1,234,567.89" ).toDouble(&ok); // ok == false - \endcode - - \warning If the string contains trailing whitespace this function - will fail, and set \a *ok to false if \a ok is not 0. Leading - whitespace is ignored. - - \sa number() TQLocale::setDefault() TQLocale::toDouble() stripWhiteSpace() -*/ - -double TQString::toDouble( bool *ok ) const -{ - // If there is trailing whitespace, set ok to false but return the correct - // result anyway to preserve behavour of pervious versions of TQt - if (length() > 0 && tqunicode()[length() - 1].isSpace()) { - TQString tmp = stripWhiteSpace(); - if (ok != 0) - *ok = FALSE; - return tmp.toDouble(); - } - - // Try the default locale - bool my_ok; - TQLocale def_locale; - double result = def_locale.d->stringToDouble(*this, &my_ok, TQLocalePrivate::FailOnGroupSeparators); - if (my_ok) { - if (ok != 0) - *ok = TRUE; - return result; - } - - // If the default was not "C", try the "C" locale - if (def_locale.language() == TQLocale::C) { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - - TQLocale c_locale(TQLocale::C); - return c_locale.d->stringToDouble(*this, ok, TQLocalePrivate::FailOnGroupSeparators); -} - -/*! - Returns the string converted to a \c float value. - - Returns 0.0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \warning If the string contains trailing whitespace this function - will fail, settings \a *ok to false if \a ok is not 0. - Leading whitespace is ignored. - - \sa number() -*/ - -#define TQT_MAX_FLOAT 3.4028234663852886e+38 - -float TQString::toFloat( bool *ok ) const -{ - bool myOk; - double d = toDouble(&myOk); - if (!myOk || d > TQT_MAX_FLOAT || d < -TQT_MAX_FLOAT) { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - if (ok != 0) - *ok = TRUE; - return (float) d; -} - -/*! - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. The returned string is in "C" locale. - - The base is 10 by default and must be between 2 and 36. - - \code - TQString string; - string = string.setNum( 1234 ); // string == "1234" - \endcode -*/ - -#else // USE_QT4 - -static int ucstrcmp( const TQString &as, const TQString &bs ) -{ - const TQChar *a = as.tqunicode(); - const TQChar *b = bs.tqunicode(); - if ( a == b ) - return 0; - if ( a == 0 ) - return 1; - if ( b == 0 ) - return -1; - int l=TQMIN(as.length(),bs.length()); - while ( l-- && *a == *b ) - a++,b++; - if ( l==-1 ) - return ( as.length()-bs.length() ); - return a->tqunicode() - b->tqunicode(); -} - -static int ucstrncmp( const TQChar *a, const TQChar *b, int l ) -{ - while ( l-- && *a == *b ) - a++,b++; - if ( l==-1 ) - return 0; - return a->tqunicode() - b->tqunicode(); -} - -static int ucstrnicmp( const TQChar *a, const TQChar *b, int l ) -{ - while ( l-- && ::lower( *a ) == ::lower( *b ) ) - a++,b++; - if ( l==-1 ) - return 0; - return ::lower( *a ).tqunicode() - ::lower( *b ).tqunicode(); -} - -static uint computeNewMax( uint len ) -{ - if (len >= 0x80000000) - return len; - - uint newMax = 4; - while ( newMax < len ) - newMax *= 2; - // try to save some memory - if ( newMax >= 1024 * 1024 && len <= newMax - (newMax >> 2) ) - newMax -= newMax >> 2; - return newMax; -} - -static bool qIsUpper(char c) -{ - return c >= 'A' && c <= 'Z'; -} - -static bool qIsDigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static char qToLower(char c) -{ - if (c >= 'A' && c <= 'Z') - return c - 'A' + 'a'; - else - return c; -} - -/*! - \class TQCharRef tqstring.h - \reentrant - \brief The TQCharRef class is a helper class for TQString. - - \ingroup text - - When you get an object of type TQCharRef, if you can assign to it, - the assignment will apply to the character in the string from - which you got the reference. That is its whole purpose in life. - The TQCharRef becomes invalid once modifications are made to the - string: if you want to keep the character, copy it into a TQChar. - - Most of the TQChar member functions also exist in TQCharRef. - However, they are not explicitly documented here. - - \sa TQString::operator[]() TQString::at() TQChar -*/ - -/*! - \class TQChar tqstring.h - \reentrant - \brief The TQChar class provides a lightweight Unicode character. - - \ingroup text - - Unicode characters are (so far) 16-bit entities without any markup - or structure. This class represents such an entity. It is - lightweight, so it can be used everywhere. Most compilers treat it - like a "short int". (In a few years it may be necessary to make - TQChar 32-bit when more than 65536 Unicode code points have been - defined and come into use.) - - TQChar provides a full complement of testing/classification - functions, converting to and from other formats, converting from - composed to decomposed Unicode, and trying to compare and - case-convert if you ask it to. - - The classification functions include functions like those in - ctype.h, but operating on the full range of Unicode characters. - They all return TRUE if the character is a certain type of - character; otherwise they return FALSE. These classification - functions are isNull() (returns TRUE if the character is U+0000), - isPrint() (TRUE if the character is any sort of printable - character, including whitespace), isPunct() (any sort of - punctation), isMark() (Unicode Mark), isLetter (a letter), - isNumber() (any sort of numeric character), isLetterOrNumber(), - and isDigit() (decimal digits). All of these are wrappers around - category() which return the Unicode-defined category of each - character. - - TQChar further provides direction(), which indicates the "natural" - writing direction of this character. The joining() function - indicates how the character joins with its neighbors (needed - mostly for Arabic) and finally mirrored(), which indicates whether - the character needs to be mirrored when it is printed in its - "unnatural" writing direction. - - Composed Unicode characters (like å) can be converted to - decomposed Unicode ("a" followed by "ring above") by using - decomposition(). - - In Unicode, comparison is not necessarily possible and case - conversion is very difficult at best. Unicode, covering the - "entire" world, also includes most of the world's case and sorting - problems. TQt tries, but not very hard: operator==() and friends - will do comparison based purely on the numeric Unicode value (code - point) of the characters, and upper() and lower() will do case - changes when the character has a well-defined upper/lower-case - equivalent. There is no provision for locale-dependent case - folding rules or comparison; these functions are meant to be fast - so they can be used unambiguously in data structures. (See - TQString::localeAwareCompare() though.) - - The conversion functions include tqunicode() (to a scalar), latin1() - (to scalar, but converts all non-Latin-1 characters to 0), row() - (gives the Unicode row), cell() (gives the Unicode cell), - digitValue() (gives the integer value of any of the numerous digit - characters), and a host of constructors. - - More information can be found in the document \link tqunicode.html - About Unicode. \endlink - - \sa TQString TQCharRef -*/ - -/*! - \enum TQChar::Category - - This enum maps the Unicode character categories. - - The following characters are normative in Unicode: - - \value Mark_NonSpacing Unicode class name Mn - - \value Mark_SpacingCombining Unicode class name Mc - - \value Mark_Enclosing Unicode class name Me - - \value Number_DecimalDigit Unicode class name Nd - - \value Number_Letter Unicode class name Nl - - \value Number_Other Unicode class name No - - \value Separator_Space Unicode class name Zs - - \value Separator_Line Unicode class name Zl - - \value Separator_Paragraph Unicode class name Zp - - \value Other_Control Unicode class name Cc - - \value Other_Format Unicode class name Cf - - \value Other_Surrogate Unicode class name Cs - - \value Other_PrivateUse Unicode class name Co - - \value Other_NotAssigned Unicode class name Cn - - - The following categories are informative in Unicode: - - \value Letter_Uppercase Unicode class name Lu - - \value Letter_Lowercase Unicode class name Ll - - \value Letter_Titlecase Unicode class name Lt - - \value Letter_Modifier Unicode class name Lm - - \value Letter_Other Unicode class name Lo - - \value Punctuation_Connector Unicode class name Pc - - \value Punctuation_Dash Unicode class name Pd - - \value Punctuation_Open Unicode class name Ps - - \value Punctuation_Close Unicode class name Pe - - \value Punctuation_InitialQuote Unicode class name Pi - - \value Punctuation_FinalQuote Unicode class name Pf - - \value Punctuation_Other Unicode class name Po - - \value Symbol_Math Unicode class name Sm - - \value Symbol_Currency Unicode class name Sc - - \value Symbol_Modifier Unicode class name Sk - - \value Symbol_Other Unicode class name So - - - There are two categories that are specific to TQt: - - \value NoCategory used when TQt is dazed and confused and cannot - make sense of anything. - - \value Punctuation_Dask old typo alias for Punctuation_Dash - -*/ - -/*! - \enum TQChar::Direction - - This enum type defines the Unicode direction attributes. See \link - http://www.tqunicode.org/ the Unicode Standard\endlink for a - description of the values. - - In order to conform to C/C++ naming conventions "Dir" is prepended - to the codes used in the Unicode Standard. -*/ - -/*! - \enum TQChar::Decomposition - - This enum type defines the Unicode decomposition attributes. See - \link http://www.tqunicode.org/ the Unicode Standard\endlink for a - description of the values. -*/ - -/*! - \enum TQChar::Joining - - This enum type defines the Unicode joining attributes. See \link - http://www.tqunicode.org/ the Unicode Standard\endlink for a - description of the values. -*/ - -/*! - \enum TQChar::CombiningClass - - This enum type defines names for some of the Unicode combining - classes. See \link http://www.tqunicode.org/ the Unicode - Standard\endlink for a description of the values. -*/ - -/*! - \fn void TQChar::setCell( uchar cell ) - \internal -*/ - -/*! - \fn void TQChar::setRow( uchar row ) - \internal -*/ - - -/*! - \fn TQChar::TQChar() - - Constructs a null TQChar (one that isNull()). -*/ - - -/*! - \fn TQChar::TQChar( char c ) - - Constructs a TQChar corresponding to ASCII/Latin-1 character \a c. -*/ - - -/*! - \fn TQChar::TQChar( uchar c ) - - Constructs a TQChar corresponding to ASCII/Latin-1 character \a c. -*/ - - -/*! - \fn TQChar::TQChar( uchar c, uchar r ) - - Constructs a TQChar for Unicode cell \a c in row \a r. -*/ - - -/*! - \fn TQChar::TQChar( const TQChar& c ) - - Constructs a copy of \a c. This is a deep copy, if such a - lightweight object can be said to have deep copies. -*/ - - -/*! - \fn TQChar::TQChar( ushort rc ) - - Constructs a TQChar for the character with Unicode code point \a rc. -*/ - - -/*! - \fn TQChar::TQChar( short rc ) - - Constructs a TQChar for the character with Unicode code point \a rc. -*/ - - -/*! - \fn TQChar::TQChar( uint rc ) - - Constructs a TQChar for the character with Unicode code point \a rc. -*/ - - -/*! - \fn TQChar::TQChar( int rc ) - - Constructs a TQChar for the character with Unicode code point \a rc. -*/ - - -/*! - \fn bool TQChar::networkOrdered () - - \obsolete - - Returns TRUE if this character is in network byte order (MSB - first); otherwise returns FALSE. This is platform dependent. -*/ - - -/*! - \fn bool TQChar::isNull() const - - Returns TRUE if the character is the Unicode character 0x0000 - (ASCII NUL); otherwise returns FALSE. -*/ - -/*! - \fn uchar TQChar::cell () const - - Returns the cell (least significant byte) of the Unicode - character. -*/ - -/*! - \fn uchar TQChar::row () const - - Returns the row (most significant byte) of the Unicode character. -*/ - -/*! - Returns TRUE if the character is a printable character; otherwise - returns FALSE. This is any character not of category Cc or Cn. - - Note that this gives no indication of whether the character is - available in a particular \link TQFont font\endlink. -*/ -bool TQChar::isPrint() const -{ - Category c = ::category( *this ); - return !(c == Other_Control || c == Other_NotAssigned); -} - -/*! - Returns TRUE if the character is a separator character - (Separator_* categories); otherwise returns FALSE. -*/ -bool TQChar::isSpace() const -{ - return ::isSpace( *this ); -} - -/*! - Returns TRUE if the character is a mark (Mark_* categories); - otherwise returns FALSE. -*/ -bool TQChar::isMark() const -{ - Category c = ::category( *this ); - return c >= Mark_NonSpacing && c <= Mark_Enclosing; -} - -/*! - Returns TRUE if the character is a punctuation mark (Punctuation_* - categories); otherwise returns FALSE. -*/ -bool TQChar::isPunct() const -{ - Category c = ::category( *this ); - return (c >= Punctuation_Connector && c <= Punctuation_Other); -} - -/*! - Returns TRUE if the character is a letter (Letter_* categories); - otherwise returns FALSE. -*/ -bool TQChar::isLetter() const -{ - Category c = ::category( *this ); - return (c >= Letter_Uppercase && c <= Letter_Other); -} - -/*! - Returns TRUE if the character is a number (of any sort - Number_* - categories); otherwise returns FALSE. - - \sa isDigit() -*/ -bool TQChar::isNumber() const -{ - Category c = ::category( *this ); - return c >= Number_DecimalDigit && c <= Number_Other; -} - -/*! - Returns TRUE if the character is a letter or number (Letter_* or - Number_* categories); otherwise returns FALSE. -*/ -bool TQChar::isLetterOrNumber() const -{ - Category c = ::category( *this ); - return (c >= Letter_Uppercase && c <= Letter_Other) - || (c >= Number_DecimalDigit && c <= Number_Other); -} - - -/*! - Returns TRUE if the character is a decimal digit - (Number_DecimalDigit); otherwise returns FALSE. -*/ -bool TQChar::isDigit() const -{ - return (::category( *this ) == Number_DecimalDigit); -} - - -/*! - Returns TRUE if the character is a symbol (Symbol_* categories); - otherwise returns FALSE. -*/ -bool TQChar::isSymbol() const -{ - Category c = ::category( *this ); - return c >= Symbol_Math && c <= Symbol_Other; -} - -/*! - Returns the numeric value of the digit, or -1 if the character is - not a digit. -*/ -int TQChar::digitValue() const -{ -#ifndef TQT_NO_UNICODETABLES - register int pos = TQUnicodeTables::decimal_info[row()]; - if( !pos ) - return -1; - return TQUnicodeTables::decimal_info[(pos<<8) + cell()]; -#else - // ##### just latin1 - if ( ucs < '0' || ucs > '9' ) - return -1; - else - return ucs - '0'; -#endif -} - -/*! - Returns the character category. - - \sa Category -*/ -TQChar::Category TQChar::category() const -{ - return ::category( *this ); -} - -/*! - Returns the character's direction. - - \sa Direction -*/ -TQChar::Direction TQChar::direction() const -{ - return ::direction( *this ); -} - -/*! - \warning This function is not supported (it may change to use - Unicode character classes). - - Returns information about the joining properties of the character - (needed for example, for Arabic). -*/ -TQChar::Joining TQChar::joining() const -{ - return ::joining( *this ); -} - - -/*! - Returns TRUE if the character is a mirrored character (one that - should be reversed if the text direction is reversed); otherwise - returns FALSE. -*/ -bool TQChar::mirrored() const -{ - return ::mirrored( *this ); -} - -/*! - Returns the mirrored character if this character is a mirrored - character, otherwise returns the character itself. -*/ -TQChar TQChar::mirroredChar() const -{ - return ::mirroredChar( *this ); -} - -#ifndef TQT_NO_UNICODETABLES -// ### REMOVE ME 4.0 -static TQString shared_decomp; -#endif -/*! - \nonreentrant - - Decomposes a character into its parts. Returns TQString::null if no - decomposition exists. -*/ -const TQString &TQChar::decomposition() const -{ -#ifndef TQT_NO_UNICODETABLES - register int pos = TQUnicodeTables::decomposition_info[row()]; - if(!pos) return TQString::null; - - pos = TQUnicodeTables::decomposition_info[(pos<<8)+cell()]; - if(!pos) return TQString::null; - pos+=2; - - TQString s; - TQ_UINT16 c; - while ( (c = TQUnicodeTables::decomposition_map[pos++]) != 0 ) - s += TQChar( c ); - // ### In 4.0, return s, and not shared_decomp. shared_decomp - // prevents this function from being reentrant. - shared_decomp = s; - return shared_decomp; -#else - return TQString::null; -#endif -} - -/*! - Returns the tag defining the composition of the character. Returns - TQChar::Single if no decomposition exists. -*/ -TQChar::Decomposition TQChar::decompositionTag() const -{ -#ifndef TQT_NO_UNICODETABLES - register int pos = TQUnicodeTables::decomposition_info[row()]; - if(!pos) return TQChar::Single; - - pos = TQUnicodeTables::decomposition_info[(pos<<8)+cell()]; - if(!pos) return TQChar::Single; - - return (TQChar::Decomposition) TQUnicodeTables::decomposition_map[pos]; -#else - return Single; // ########### FIX eg. just latin1 -#endif -} - -/*! - Returns the combining class for the character as defined in the - Unicode standard. This is mainly useful as a positioning hint for - marks attached to a base character. - - The TQt text rendering engine uses this information to correctly - position non spacing marks around a base character. -*/ -unsigned char TQChar::combiningClass() const -{ - return ::combiningClass( *this ); -} - - -/*! - Returns the lowercase equivalent if the character is uppercase; - otherwise returns the character itself. -*/ -TQChar TQChar::lower() const -{ - return ::lower( *this ); -} - -/*! - Returns the uppercase equivalent if the character is lowercase; - otherwise returns the character itself. -*/ -TQChar TQChar::upper() const -{ - return ::upper( *this ); -} - -/*! - \fn TQChar::operator char() const - - Returns the Latin-1 character equivalent to the TQChar, or 0. This - is mainly useful for non-internationalized software. - - \sa tqunicode() -*/ - -/*! - \fn ushort TQChar::tqunicode() const - - Returns the numeric Unicode value equal to the TQChar. Normally, - you should use TQChar objects as they are equivalent, but for some - low-level tasks (e.g. indexing into an array of Unicode - information), this function is useful. -*/ - -/*! - \fn ushort & TQChar::tqunicode() - - \overload - - Returns a reference to the numeric Unicode value equal to the - TQChar. -*/ - -/***************************************************************************** - Documentation of TQChar related functions - *****************************************************************************/ - -/*! - \fn bool operator==( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if \a c1 and \a c2 are the same Unicode character; - otherwise returns FALSE. -*/ - -/*! - \fn bool operator==( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if \a c is the ASCII/Latin-1 character \a ch; - otherwise returns FALSE. -*/ - -/*! - \fn bool operator==( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if \a c is the ASCII/Latin-1 character \a ch; - otherwise returns FALSE. -*/ - -/*! - \fn int operator!=( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if \a c1 and \a c2 are not the same Unicode - character; otherwise returns FALSE. -*/ - -/*! - \fn int operator!=( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if \a c is not the ASCII/Latin-1 character \a ch; - otherwise returns FALSE. -*/ - -/*! - \fn int operator!=( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if \a c is not the ASCII/Latin-1 character \a ch; - otherwise returns FALSE. -*/ - -/*! - \fn int operator<=( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c1 is less than - that of \a c2, or they are the same Unicode character; otherwise - returns FALSE. -*/ - -/*! - \fn int operator<=( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c is less than or - equal to that of the ASCII/Latin-1 character \a ch; otherwise - returns FALSE. -*/ - -/*! - \fn int operator<=( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of the ASCII/Latin-1 - character \a ch is less than or equal to that of \a c; otherwise - returns FALSE. -*/ - -/*! - \fn int operator>=( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c1 is greater than - that of \a c2, or they are the same Unicode character; otherwise - returns FALSE. -*/ - -/*! - \fn int operator>=( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c is greater than - or equal to that of the ASCII/Latin-1 character \a ch; otherwise - returns FALSE. -*/ - -/*! - \fn int operator>=( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of the ASCII/Latin-1 - character \a ch is greater than or equal to that of \a c; - otherwise returns FALSE. -*/ - -/*! - \fn int operator<( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c1 is less than - that of \a c2; otherwise returns FALSE. -*/ - -/*! - \fn int operator<( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c is less than that - of the ASCII/Latin-1 character \a ch; otherwise returns FALSE. -*/ - -/*! - \fn int operator<( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of the ASCII/Latin-1 - character \a ch is less than that of \a c; otherwise returns - FALSE. -*/ - -/*! - \fn int operator>( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c1 is greater than - that of \a c2; otherwise returns FALSE. -*/ - -/*! - \fn int operator>( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c is greater than - that of the ASCII/Latin-1 character \a ch; otherwise returns FALSE. -*/ - -/*! - \fn int operator>( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of the ASCII/Latin-1 - character \a ch is greater than that of \a c; otherwise returns - FALSE. -*/ - -#ifndef TQT_NO_UNICODETABLES - -// small class used internally in TQString::Compose() -class TQLigature -{ -public: - TQLigature( TQChar c ); - - TQ_UINT16 first() { cur = ligatures; return cur ? *cur : 0; } - TQ_UINT16 next() { return cur && *cur ? *(cur++) : 0; } - TQ_UINT16 current() { return cur ? *cur : 0; } - - int match(TQString & str, unsigned int index); - TQChar head(); - TQChar::Decomposition tag(); - -private: - TQ_UINT16 *ligatures; - TQ_UINT16 *cur; -}; - -TQLigature::TQLigature( TQChar c ) -{ - register int pos = TQUnicodeTables::ligature_info[c.row()]; - if( !pos ) - ligatures = 0; - else - { - pos = TQUnicodeTables::ligature_info[(pos<<8)+c.cell()]; - ligatures = (TQ_UINT16 *)&(TQUnicodeTables::ligature_map[pos]); - } - cur = ligatures; -} - -TQChar TQLigature::head() -{ - if(current()) - return TQChar(TQUnicodeTables::decomposition_map[current()+1]); - - return TQChar::null; -} - -TQChar::Decomposition TQLigature::tag() -{ - if(current()) - return (TQChar::Decomposition) TQUnicodeTables::decomposition_map[current()]; - - return TQChar::Canonical; -} - -int TQLigature::match(TQString & str, unsigned int index) -{ - unsigned int i=index; - - if(!current()) return 0; - - TQ_UINT16 lig = current() + 2; - TQ_UINT16 ch; - - while ((i < str.length()) && (ch = TQUnicodeTables::decomposition_map[lig])) { - if (str[(int)i] != TQChar(ch)) - return 0; - i++; - lig++; - } - - if (!TQUnicodeTables::decomposition_map[lig]) - { - return i-index; - } - return 0; -} - - -// this function is just used in TQString::compose() -static inline bool format(TQChar::Decomposition tag, TQString & str, - int index, int len) -{ - unsigned int l = index + len; - unsigned int r = index; - - bool left = FALSE, right = FALSE; - - left = ((l < str.length()) && - ((str[(int)l].joining() == TQChar::Dual) || - (str[(int)l].joining() == TQChar::Right))); - if (r > 0) { - r--; - //printf("joining(right) = %d\n", str[(int)r].joining()); - right = (str[(int)r].joining() == TQChar::Dual); - } - - - switch (tag) { - case TQChar::Medial: - return (left & right); - case TQChar::Initial: - return (left && !right); - case TQChar::Final: - return (right);// && !left); - case TQChar::Isolated: - default: - return (!right && !left); - } -} // format() -#endif - -/* - TQString::compose() and visual() were developed by Gordon Tisher - <tisher@uniserve.ca>, with input from Lars Knoll <knoll@mpi-hd.mpg.de>, - who developed the tqunicode data tables. -*/ -/*! - \warning This function is not supported in TQt 3.x. It is provided - for experimental and illustrative purposes only. It is mainly of - interest to those experimenting with Arabic and other - composition-rich texts. - - Applies possible ligatures to a TQString. Useful when - composition-rich text requires rendering with glyph-poor fonts, - but it also makes compositions such as TQChar(0x0041) ('A') and - TQChar(0x0308) (Unicode accent diaresis), giving TQChar(0x00c4) - (German A Umlaut). -*/ -void TQString::compose() -{ -#ifndef TQT_NO_UNICODETABLES - unsigned int index=0, len; - unsigned int cindex = 0; - - TQChar code, head; - - TQMemArray<TQChar> dia; - - TQString composed = *this; - - while (index < length()) { - code = at(index); - //printf("\n\nligature for 0x%x:\n", code.tqunicode()); - TQLigature ligature(code); - ligature.first(); - while ( ligature.current() ) { - if ((len = ligature.match(*this, index)) != 0) { - head = ligature.head(); - unsigned short code = head.tqunicode(); - // we exclude Arabic presentation forms A and a few - // other ligatures, which are undefined in most fonts - if(!(code > 0xfb50 && code < 0xfe80) && - !(code > 0xfb00 && code < 0xfb2a)) { - // joining info is only needed for Arabic - if (format(ligature.tag(), *this, index, len)) { - //printf("using ligature 0x%x, len=%d\n",code,len); - // replace letter - composed.replace(cindex, len, TQChar(head)); - index += len-1; - // we continue searching in case we have a final - // form because medial ones are preferred. - if ( len != 1 || ligature.tag() !=TQChar::Final ) - break; - } - } - } - ligature.next(); - } - cindex++; - index++; - } - *this = composed; -#endif -} - - -// These macros are used for efficient allocation of TQChar strings. -// IMPORTANT! If you change these, make sure you also change the -// "delete tqunicode" statement in ~TQStringData() in tqstring.h correspondingly! - -#define TQT_ALLOC_TQCHAR_VEC( N ) (TQChar*) new char[ sizeof(TQChar)*( N ) ] -#define TQT_DELETE_TQCHAR_VEC( P ) delete[] ((char*)( P )) - - -/*! - This utility function converts the 8-bit string \a ba to Unicode, - returning the result. - - The caller is responsible for deleting the return value with - delete[]. -*/ - -TQChar* TQString::latin1ToUnicode( const TQByteArray& ba, uint* len ) -{ - if ( ba.isNull() ) { - *len = 0; - return 0; - } - int l = 0; - while ( l < (int)ba.size() && ba[l] ) - l++; - const char* str = ba.data(); - TQChar *uc = new TQChar[ l ]; // Can't use macro, since function is public - TQChar *result = uc; - if ( len ) - *len = l; - while (l--) - *uc++ = *str++; - return result; -} - -static TQChar* internalLatin1ToUnicode( const TQByteArray& ba, uint* len ) -{ - if ( ba.isNull() ) { - *len = 0; - return 0; - } - int l = 0; - while ( l < (int)ba.size() && ba[l] ) - l++; - const char* str = ba.data(); - TQChar *uc = TQT_ALLOC_TQCHAR_VEC( l ); - TQChar *result = uc; - if ( len ) - *len = l; - while (l--) - *uc++ = *str++; - return result; -} - -/*! - \overload - - This utility function converts the '\0'-terminated 8-bit string \a - str to Unicode, returning the result and setting \a *len to the - length of the Unicode string. - - The caller is responsible for deleting the return value with - delete[]. -*/ - -TQChar* TQString::latin1ToUnicode( const char *str, uint* len, uint maxlen ) -{ - TQChar* result = 0; - uint l = 0; - if ( str ) { - if ( maxlen != (uint)-1 ) { - while ( l < maxlen && str[l] ) - l++; - } else { - // Faster? - l = int(strlen( str )); - } - TQChar *uc = new TQChar[ l ]; // Can't use macro since function is public - result = uc; - uint i = l; - while ( i-- ) - *uc++ = *str++; - } - if ( len ) - *len = l; - return result; -} - -static TQChar* internalLatin1ToUnicode( const char *str, uint* len, - uint maxlen = (uint)-1 ) -{ - TQChar* result = 0; - uint l = 0; - if ( str ) { - if ( maxlen != (uint)-1 ) { - while ( l < maxlen && str[l] ) - l++; - } else { - // Faster? - l = int(strlen( str )); - } - TQChar *uc = TQT_ALLOC_TQCHAR_VEC( l ); - result = uc; - uint i = l; - while ( i-- ) - *uc++ = *str++; - } - if ( len ) - *len = l; - return result; -} - -/*! - This utility function converts \a l 16-bit characters from \a uc - to ASCII, returning a '\0'-terminated string. - - The caller is responsible for deleting the resultant string with - delete[]. -*/ -char* TQString::tqunicodeToLatin1(const TQChar *uc, uint l) -{ - if (!uc) { - return 0; - } - char *a = new char[l+1]; - char *result = a; - while (l--) { - *a++ = (uc->tqunicode() > 0xff) ? '?' : (char)uc->tqunicode(); - uc++; - } - *a = '\0'; - return result; -} - -/***************************************************************************** - TQString member functions - *****************************************************************************/ - -/*! - \class TQString tqstring.h - \reentrant - - \brief The TQString class provides an abstraction of Unicode text - and the classic C '\0'-terminated char array. - - \ingroup tools - \ingroup shared - \ingroup text - \mainclass - - TQString uses \link shclass.html implicit sharing\endlink, which - makes it very efficient and easy to use. - - In all of the TQString methods that take \c {const char *} - parameters, the \c {const char *} is interpreted as a classic - C-style '\0'-terminated ASCII string. It is legal for the \c - {const char *} parameter to be 0. If the \c {const char *} is not - '\0'-terminated, the results are undefined. Functions that copy - classic C strings into a TQString will not copy the terminating - '\0' character. The TQChar array of the TQString (as returned by - tqunicode()) is generally not terminated by a '\0'. If you need to - pass a TQString to a function that requires a C '\0'-terminated - string use latin1(). - - \keyword TQString::null - A TQString that has not been assigned to anything is \e null, i.e. - both the length and data pointer is 0. A TQString that references - the empty string ("", a single '\0' char) is \e empty. Both null - and empty TQStrings are legal parameters to the methods. Assigning - \c{(const char *) 0} to TQString gives a null TQString. For - convenience, \c TQString::null is a null TQString. When sorting, - empty strings come first, followed by non-empty strings, followed - by null strings. We recommend using \c{if ( !str.isNull() )} to - check for a non-null string rather than \c{if ( !str )}; see \l - operator!() for an explanation. - - Note that if you find that you are mixing usage of \l TQCString, - TQString, and \l TQByteArray, this causes lots of unnecessary - copying and might indicate that the true nature of the data you - are dealing with is uncertain. If the data is '\0'-terminated 8-bit - data, use \l TQCString; if it is unterminated (i.e. contains '\0's) - 8-bit data, use \l TQByteArray; if it is text, use TQString. - - Lists of strings are handled by the TQStringList class. You can - split a string into a list of strings using TQStringList::split(), - and join a list of strings into a single string with an optional - separator using TQStringList::join(). You can obtain a list of - strings from a string list that contain a particular substring or - that match a particular \link tqregexp.html regex\endlink using - TQStringList::grep(). - - <b>Note for C programmers</b> - - Due to C++'s type system and the fact that TQString is implicitly - shared, TQStrings can be treated like ints or other simple base - types. For example: - - \code - TQString boolToString( bool b ) - { - TQString result; - if ( b ) - result = "True"; - else - result = "False"; - return result; - } - \endcode - - The variable, result, is an auto variable allocated on the stack. - When return is called, because we're returning by value, The copy - constructor is called and a copy of the string is returned. (No - actual copying takes place thanks to the implicit sharing, see - below.) - - Throughout TQt's source code you will encounter TQString usages like - this: - \code - TQString func( const TQString& input ) - { - TQString output = input; - // process output - return output; - } - \endcode - - The 'copying' of input to output is almost as fast as copying a - pointer because behind the scenes copying is achieved by - incrementing a reference count. TQString (like all TQt's implicitly - shared classes) operates on a copy-on-write basis, only copying if - an instance is actually changed. - - If you wish to create a deep copy of a TQString without losing any - Unicode information then you should use TQDeepCopy. - - \sa TQChar TQCString TQByteArray TQConstString -*/ - -/*! \enum TQt::ComparisonFlags -\internal -*/ -/*! - \enum TQt::StringComparisonMode - - This enum type is used to set the string comparison mode when - searching for an item. It is used by TQListBox, TQListView and - TQIconView, for example. We'll refer to the string being searched - as the 'target' string. - - \value CaseSensitive The strings must match case sensitively. - \value ExactMatch The target and search strings must match exactly. - \value BeginsWith The target string begins with the search string. - \value EndsWith The target string ends with the search string. - \value Contains The target string contains the search string. - - If you OR these flags together (excluding \c CaseSensitive), the - search criteria be applied in the following order: \c ExactMatch, - \c BeginsWith, \c EndsWith, \c Contains. - - Matching is case-insensitive unless \c CaseSensitive is set. \c - CaseSensitive can be OR-ed with any combination of the other - flags. - -*/ -TQ_EXPORT TQStringData *TQString::shared_null = 0; -TQT_STATIC_CONST_IMPL TQString TQString::null; -TQT_STATIC_CONST_IMPL TQChar TQChar::null; -TQT_STATIC_CONST_IMPL TQChar TQChar::replacement((ushort)0xfffd); -TQT_STATIC_CONST_IMPL TQChar TQChar::byteOrderMark((ushort)0xfeff); -TQT_STATIC_CONST_IMPL TQChar TQChar::byteOrderSwapped((ushort)0xfffe); -TQT_STATIC_CONST_IMPL TQChar TQChar::nbsp((ushort)0x00a0); - -TQStringData* TQString::makeSharedNull() -{ - TQString::shared_null = new TQStringData; -#if defined( TQ_OS_MAC ) || defined(TQ_OS_SOLARIS) || defined(TQ_OS_HPUX) || defined(TQ_OS_AIX) - TQString *that = const_cast<TQString *>(&TQString::null); - that->d = TQString::shared_null; -#endif - return TQString::shared_null; -} - -/*! - \fn TQString::TQString() - - Constructs a null string, i.e. both the length and data pointer - are 0. - - \sa isNull() -*/ - -/*! - Constructs a string of length one, containing the character \a ch. -*/ -TQString::TQString( TQChar ch ) -{ - d = new TQStringData( TQT_ALLOC_TQCHAR_VEC( 1 ), 1, 1 ); - d->tqunicode[0] = ch; -} - -/*! - Constructs an implicitly shared copy of \a s. This is very fast - since it only involves incrementing a reference count. -*/ -TQString::TQString( const TQString &s ) : - d(s.d) -{ - d->ref(); -} - -#ifdef USE_QT4 - -// Interoperability -// FIXME -// These conversions are probably too weak - -/*! - QT4 INTEROPERABILITY -*/ -TQString::TQString( const QString &qs ) -{ - setAscii( TQString(qs).ascii() ); -} - -/*! - QT4 INTEROPERABILITY -*/ -TQString::operator QString() const -{ - return QString::fromUtf8( this->utf8() ); -} - -/*! - QT4 INTEROPERABILITY -*/ -TQString &TQString::operator=( const QString &qs ) -{ - return setAscii( TQString(qs).ascii() ); -} - -bool operator==( const QString &s1, const TQString &s2 ) -{ - return (TQString(s1).ascii() == s2.ascii()); -} - -#endif // USE_QT4 - -/*! - \internal - - Private function. - - Constructs a string with preallocated space for \a size characters. - - The string is empty. - - \sa isNull() -*/ - -TQString::TQString( int size, bool /*dummy*/ ) -{ - if ( size ) { - int l = size; - TQChar* uc = TQT_ALLOC_TQCHAR_VEC( l ); - d = new TQStringData( uc, 0, l ); - } else { - d = shared_null ? shared_null : (shared_null=new TQStringData); - d->ref(); - } -} - -/*! - Constructs a string that is a deep copy of \a ba interpreted as a - classic C string. -*/ - -TQString::TQString( const TQByteArray& ba ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - d = 0; - *this = fromAscii( ba.data(), ba.size() ); - return; - } -#endif - uint l; - TQChar *uc = internalLatin1ToUnicode(ba,&l); - d = new TQStringData(uc,l,l); -} - -/*! - Constructs a string that is a deep copy of the first \a length - characters in the TQChar array. - - If \a tqunicode and \a length are 0, then a null string is created. - - If only \a tqunicode is 0, the string is empty but has \a length - characters of space preallocated: TQString expands automatically - anyway, but this may speed up some cases a little. We recommend - using the plain constructor and setLength() for this purpose since - it will result in more readable code. - - \sa isNull() setLength() -*/ - -TQString::TQString( const TQChar* tqunicode, uint length ) -{ - if ( !tqunicode && !length ) { - d = shared_null ? shared_null : makeSharedNull(); - d->ref(); - } else { - TQChar* uc = TQT_ALLOC_TQCHAR_VEC( length ); - if ( tqunicode ) - memcpy(uc, tqunicode, length*sizeof(TQChar)); - d = new TQStringData(uc,tqunicode ? length : 0,length); - } -} - -/*! - Constructs a string that is a deep copy of \a str, interpreted as - a classic C string. The encoding is assumed to be Latin-1, unless - you change it using TQTextCodec::setCodecForCStrings(). - - If \a str is 0, then a null string is created. - - This is a cast constructor, but it is perfectly safe: converting a - Latin-1 \c{const char *} to TQString preserves all the information. You - can disable this constructor by defining \c TQT_NO_CAST_ASCII when - you compile your applications. You can also make TQString objects - by using setLatin1(), tqfromLatin1(), fromLocal8Bit(), and - fromUtf8(). Or whatever encoding is appropriate for the 8-bit data - you have. - - \sa isNull(), fromAscii() -*/ - -TQString::TQString( const char *str ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - d = 0; - *this = fromAscii( str ); - return; - } -#endif - uint l; - TQChar *uc = internalLatin1ToUnicode(str,&l); - d = new TQStringData(uc,l,l); -} - -#ifndef TQT_NO_STL -/*! - Constructs a string that is a deep copy of \a str. - - This is the same as fromAscii(\a str). -*/ - -TQString::TQString( const std::string &str ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - d = 0; - *this = fromAscii( str.c_str() ); - return; - } -#endif - uint l; - TQChar *uc = internalLatin1ToUnicode(str.c_str(),&l); - d = new TQStringData(uc,l,l); -} -#endif - -/*! - \fn TQString::~TQString() - - Destroys the string and frees the string's data if this is the - last reference to the string. -*/ - - -/*! - Deallocates any space reserved solely by this TQString. - - If the string does not share its data with another TQString - instance, nothing happens; otherwise the function creates a new, - unique copy of this string. This function is called whenever the - string is modified. -*/ - -void TQString::real_detach() -{ - setLength( length() ); -} - -void TQString::deref() -{ - if ( d && d->deref() ) { - if ( d != shared_null ) - delete d; - d = 0; - } -} - -void TQStringData::deleteSelf() -{ - delete this; -} - -/*! - \fn TQString& TQString::operator=( TQChar c ) - - Sets the string to contain just the single character \a c. -*/ - -/*! - \fn TQString& TQString::operator=( const std::string& s ) - - \overload - - Makes a deep copy of \a s and returns a reference to the deep - copy. -*/ - -/*! - \fn TQString& TQString::operator=( char c ) - - \overload - - Sets the string to contain just the single character \a c. -*/ - -/*! - \overload - - Assigns a shallow copy of \a s to this string and returns a - reference to this string. This is very fast because the string - isn't actually copied. -*/ -TQString &TQString::operator=( const TQString &s ) -{ - s.d->ref(); - deref(); - d = s.d; - return *this; -} - -/*! - \overload - - Assigns a deep copy of \a cstr, interpreted as a classic C - string, to this string. Returns a reference to this string. -*/ -TQString &TQString::operator=( const TQCString& cstr ) -{ - return setAscii( cstr ); -} - - -/*! - \overload - - Assigns a deep copy of \a str, interpreted as a classic C string - to this string and returns a reference to this string. - - If \a str is 0, then a null string is created. - - \sa isNull() -*/ -TQString &TQString::operator=( const char *str ) -{ - return setAscii(str); -} - - -/*! - \fn bool TQString::isNull() const - - Returns TRUE if the string is null; otherwise returns FALSE. A - null string is always empty. - - \code - TQString a; // a.tqunicode() == 0, a.length() == 0 - a.isNull(); // TRUE, because a.tqunicode() == 0 - a.isEmpty(); // TRUE, because a.length() == 0 - \endcode - - \sa isEmpty(), length() -*/ - -/*! - \fn bool TQString::isEmpty() const - - Returns TRUE if the string is empty, i.e. if length() == 0; - otherwise returns FALSE. Null strings are also empty. - - \code - TQString a( "" ); - a.isEmpty(); // TRUE - a.isNull(); // FALSE - - TQString b; - b.isEmpty(); // TRUE - b.isNull(); // TRUE - \endcode - - \sa isNull(), length() -*/ - -/*! - \fn uint TQString::length() const - - Returns the length of the string. - - Null strings and empty strings have zero length. - - \sa isNull(), isEmpty() -*/ - -/*! - If \a newLen is less than the length of the string, then the - string is truncated at position \a newLen. Otherwise nothing - happens. - - \code - TQString s = "truncate me"; - s.truncate( 5 ); // s == "trunc" - \endcode - - \sa setLength() -*/ - -void TQString::truncate( uint newLen ) -{ - if ( newLen < d->len ) - setLength( newLen ); -} - -/*! - Ensures that at least \a newLen characters are allocated to the - string, and sets the length of the string to \a newLen. Any new - space allocated contains arbitrary data. - - \sa reserve(), truncate() -*/ -void TQString::setLength( uint newLen ) -{ - if ( d->count != 1 || newLen > d->maxl || - ( newLen * 4 < d->maxl && d->maxl > 4 ) ) { - // detach, grow or shrink - uint newMax = computeNewMax( newLen ); - TQChar* nd = TQT_ALLOC_TQCHAR_VEC( newMax ); - if ( nd ) { - uint len = TQMIN( d->len, newLen ); - memcpy( nd, d->tqunicode, sizeof(TQChar) * len ); - deref(); - d = new TQStringData( nd, newLen, newMax ); - } - } else { - d->len = newLen; - d->setDirty(); - } -} - -/*! - \fn uint TQString::capacity() const - - Returns the number of characters this string can hold - in the allocated memory. - - \sa reserve(), squeeze() -*/ - -/*! - Ensures that at least \a minCapacity characters are allocated to - the string. - - This function is useful for code that needs to build up a long - string and wants to avoid repeated reallocation. In this example, - we want to add to the string until some condition is true, and - we're fairly sure that size is big enough: - \code - TQString result; - int len = 0; - result.reserve(maxLen); - while (...) { - result[len++] = ... // fill part of the space - } - result.squeeze(); - \endcode - - If \e maxLen is an underestimate, the worst that will happen is - that the loop will slow down. - - If it is not possible to allocate enough memory, the string - remains unchanged. - - \sa capacity(), squeeze(), setLength() -*/ - -void TQString::reserve( uint minCapacity ) -{ - if ( d->maxl < minCapacity ) { - TQChar *nd = TQT_ALLOC_TQCHAR_VEC( minCapacity ); - if ( nd ) { - uint len = d->len; - if ( len ) - memcpy( nd, d->tqunicode, sizeof(TQChar) * len ); - deref(); - d = new TQStringData( nd, len, minCapacity ); - } - } -} - - -/*! - Squeezes the string's capacity to the current content. - - \sa capacity(), reserve() -*/ -void TQString::squeeze() -{ - if ( d->maxl > d->len ) { - TQChar *nd = TQT_ALLOC_TQCHAR_VEC( d->len ); - if ( nd ) { - uint len = d->len; - if ( len ) - memcpy( nd, d->tqunicode, sizeof(TQChar) * len ); - deref(); - d = new TQStringData( nd, len, len ); - } - } -} - -/*! - \internal - - Like setLength, but doesn't shrink the allocated memory. -*/ -void TQString::grow( uint newLen ) -{ - if ( d->count != 1 || newLen > d->maxl ) { - setLength( newLen ); - } else { - d->len = newLen; - d->setDirty(); - } -} - -struct ArgEscapeData -{ - uint min_escape; // lowest escape sequence number - uint occurrences; // number of occurences of the lowest escape - // sequence number - uint locale_occurrences; // number of occurences of the lowest escape - // sequence number which contain 'L' - uint escape_len; // total length of escape sequences which will - // be replaced -}; - -static ArgEscapeData findArgEscapes(const TQString &s) -{ - const TQChar *uc_begin = s.tqunicode(); - const TQChar *uc_end = uc_begin + s.length(); - - ArgEscapeData d; - - d.min_escape = 10; - d.occurrences = 0; - d.escape_len = 0; - d.locale_occurrences = 0; - - const TQChar *c = uc_begin; - while (c != uc_end) { - while (c != uc_end && c->tqunicode() != '%') - ++c; - - if (c == uc_end || ++c == uc_end) - break; - - bool locale_arg = FALSE; - if (c->tqunicode() == 'L') { - locale_arg = TRUE; - if (++c == uc_end) - break; - } - - if (c->tqunicode() < '0' || c->tqunicode() > '9') - continue; - - uint escape = c->tqunicode() - '0'; - ++c; - - if (escape > d.min_escape) - continue; - - if (escape < d.min_escape) { - d.min_escape = escape; - d.occurrences = 0; - d.escape_len = 0; - d.locale_occurrences = 0; - } - -#if TQT_VERSION < 0x040000 - // ### remove preprocessor in TQt 4.0 - /* Since in TQt < 4.0 only the first instance is replaced, - escape_len should hold the length of only the first escape - sequence */ - if (d.occurrences == 0) -#endif - { - ++d.occurrences; - if (locale_arg) { - ++d.locale_occurrences; - d.escape_len += 3; - } - else - d.escape_len += 2; - } - } - - return d; -} - -static TQString replaceArgEscapes(const TQString &s, const ArgEscapeData &d, int field_width, - const TQString &arg, const TQString &larg) -{ - const TQChar *uc_begin = s.tqunicode(); - const TQChar *uc_end = uc_begin + s.length(); - - uint abs_field_width = TQABS(field_width); - uint result_len = s.length() - - d.escape_len - + (d.occurrences - d.locale_occurrences) - *TQMAX(abs_field_width, arg.length()) - + d.locale_occurrences - *TQMAX(abs_field_width, larg.length()); - - TQString result; - result.setLength(result_len); - TQChar *result_buff = (TQChar*) result.tqunicode(); - - TQChar *rc = result_buff; - const TQChar *c = uc_begin; - uint repl_cnt = 0; - while (c != uc_end) { - /* We don't have to check if we run off the end of the string with c, - because as long as d.occurrences > 0 we KNOW there are valid escape - sequences. */ - - const TQChar *text_start = c; - - while (c->tqunicode() != '%') - ++c; - - const TQChar *escape_start = c++; - - bool locale_arg = FALSE; - if (c->tqunicode() == 'L') { - locale_arg = TRUE; - ++c; - } - - if (c->tqunicode() != '0' + d.min_escape) { - memcpy(rc, text_start, (c - text_start)*sizeof(TQChar)); - rc += c - text_start; - } - else { - ++c; - - memcpy(rc, text_start, (escape_start - text_start)*sizeof(TQChar)); - rc += escape_start - text_start; - - uint pad_chars; - if (locale_arg) - pad_chars = TQMAX(abs_field_width, larg.length()) - larg.length(); - else - pad_chars = TQMAX(abs_field_width, arg.length()) - arg.length(); - - if (field_width > 0) { // left padded - for (uint i = 0; i < pad_chars; ++i) - (rc++)->tqunicode() = ' '; - } - - if (locale_arg) { - memcpy(rc, larg.tqunicode(), larg.length()*sizeof(TQChar)); - rc += larg.length(); - } - else { - memcpy(rc, arg.tqunicode(), arg.length()*sizeof(TQChar)); - rc += arg.length(); - } - - if (field_width < 0) { // right padded - for (uint i = 0; i < pad_chars; ++i) - (rc++)->tqunicode() = ' '; - } - - if (++repl_cnt == d.occurrences) { - memcpy(rc, c, (uc_end - c)*sizeof(TQChar)); - rc += uc_end - c; - TQ_ASSERT(rc - result_buff == (int)result_len); - c = uc_end; - } - } - } - - return result; -} - -/*! - This function will return a string that replaces the lowest - numbered occurrence of \c %1, \c %2, ..., \c %9 with \a a. - - The \a fieldWidth value specifies the minimum amount of space that - \a a is padded to. A positive value will produce right-aligned - text, whereas a negative value will produce left-aligned text. - - The following example shows how we could create a 'status' string - when processing a list of files: - \code - TQString status = TQString( "Processing file %1 of %2: %3" ) - .arg( i ) // current file's number - .arg( total ) // number of files to process - .arg( fileName ); // current file's name - \endcode - - It is generally fine to use filenames and numbers as we have done - in the example above. But note that using arg() to construct - natural language sentences does not usually translate well into - other languages because sentence structure and word order often - differ between languages. - - If there is no place marker (\c %1, \c %2, etc.), a warning - message (qWarning()) is output and the result is undefined. - - \warning If any placeholder occurs more than once, the result is undefined. - -*/ -TQString TQString::arg( const TQString& a, int fieldWidth ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::arg(): Argument missing: %s, %s", latin1(), - a.latin1() ); - return *this; - } - - return replaceArgEscapes(*this, d, fieldWidth, a, a); -} - -/*! - \fn TQString TQString::arg( const TQString& a1, const TQString& a2 ) const - - \overload - - This is the same as str.arg(\a a1).arg(\a a2), except that - the strings are replaced in one pass. This can make a difference - if \a a1 contains e.g. \c{%1}: - - \code - TQString str( "%1 %2" ); - str.arg( "Hello", "world" ); // returns "Hello world" - str.arg( "Hello" ).arg( "world" ); // returns "Hello world" - - str.arg( "(%1)", "Hello" ); // returns "(%1) Hello" - str.arg( "(%1)" ).arg( "Hello" ); // returns "(Hello) %2" - \endcode -*/ - -/*! - \fn TQString TQString::arg( const TQString& a1, const TQString& a2, - const TQString& a3 ) const - \overload - - This is the same as calling str.arg(\a a1).arg(\a a2).arg(\a a3), - except that the strings are replaced in one pass. -*/ - -/*! - \fn TQString TQString::arg( const TQString& a1, const TQString& a2, - const TQString& a3, const TQString& a4 ) const - \overload - - This is the same as calling - str.arg(\a a1).arg(\a a2).arg(\a a3).arg(\a a4), - except that the strings are replaced in one pass. -*/ - -/*! - \overload - - The \a fieldWidth value specifies the minimum amount of space that - \a a is padded to. A positive value will produce a right-aligned - number, whereas a negative value will produce a left-aligned - number. - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. - - The '%' can be followed by an 'L', in which case the sequence is - replaced with a localized representation of \a a. The conversion - uses the default locale. The default locale is determined from the - system's locale settings at application startup. It can be changed - using TQLocale::setDefault(). The 'L' flag is ignored if \a base is - not 10. - - \code - TQString str; - str = TQString( "Decimal 63 is %1 in hexadecimal" ) - .arg( 63, 0, 16 ); - // str == "Decimal 63 is 3f in hexadecimal" - - TQLocale::setDefault(TQLocale::English, TQLocale::UnitedStates); - str = TQString( "%1 %L2 %L3" ) - .arg( 12345 ) - .arg( 12345 ) - .arg( 12345, 0, 16 ); - // str == "12345 12,345 3039" - \endcode -*/ -TQString TQString::arg( long a, int fieldWidth, int base ) const -{ - return arg((TQ_LLONG)a, fieldWidth, base); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::arg( ulong a, int fieldWidth, int base ) const -{ - return arg((TQ_ULLONG)a, fieldWidth, base); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::arg( TQ_LLONG a, int fieldWidth, int base ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::arg(): Argument missing: %s, %lld", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, base); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - locale_arg = locale.d->longLongToString(a, -1, base, -1, TQLocalePrivate::ThousandsGroup); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::arg( TQ_ULLONG a, int fieldWidth, int base ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::arg(): Argument missing: %s, %llu", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, base); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - locale_arg = locale.d->unsLongLongToString(a, -1, base, -1, TQLocalePrivate::ThousandsGroup); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -/*! - \fn TQString TQString::arg( int a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::arg( uint a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::arg( short a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::arg( ushort a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - - -/*! - \overload - - \a a is assumed to be in the Latin-1 character set. -*/ -TQString TQString::arg( char a, int fieldWidth ) const -{ - TQString c; - c += a; - return arg( c, fieldWidth ); -} - -/*! - \overload -*/ -TQString TQString::arg( TQChar a, int fieldWidth ) const -{ - TQString c; - c += a; - return arg( c, fieldWidth ); -} - -/*! - \overload - - \target arg-formats - - Argument \a a is formatted according to the \a fmt format specified, - which is 'g' by default and can be any of the following: - - \table - \header \i Format \i Meaning - \row \i \c e \i format as [-]9.9e[+|-]999 - \row \i \c E \i format as [-]9.9E[+|-]999 - \row \i \c f \i format as [-]9.9 - \row \i \c g \i use \c e or \c f format, whichever is the most concise - \row \i \c G \i use \c E or \c f format, whichever is the most concise - \endtable - - With 'e', 'E', and 'f', \a prec is the number of digits after the - decimal point. With 'g' and 'G', \a prec is the maximum number of - significant digits (trailing zeroes are omitted). - - \code - double d = 12.34; - TQString ds = TQString( "'E' format, precision 3, gives %1" ) - .arg( d, 0, 'E', 3 ); - // ds == "'E' format, precision 3, gives 1.234E+01" - \endcode - - The '%L' syntax can be used to produce localized strings. -*/ -TQString TQString::arg( double a, int fieldWidth, char fmt, int prec ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::arg(): Argument missing: %s, %g", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, fmt, prec); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - - TQLocalePrivate::DoubleForm form = TQLocalePrivate::DFDecimal; - uint flags = 0; - - if (qIsUpper(fmt)) - flags = TQLocalePrivate::CapitalEorX; - fmt = qToLower(fmt); - - switch (fmt) { - case 'f': - form = TQLocalePrivate::DFDecimal; - break; - case 'e': - form = TQLocalePrivate::DFExponent; - break; - case 'g': - form = TQLocalePrivate::DFSignificantDigits; - break; - default: -#if defined(TQT_CHECK_RANGE) - qWarning( "TQString::setNum: Invalid format char '%c'", fmt ); -#endif - break; - } - - flags |= TQLocalePrivate::ThousandsGroup; - - locale_arg = locale.d->doubleToString(a, prec, form, -1, flags); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -TQString TQString::multiArg( int numArgs, const TQString& a1, const TQString& a2, - const TQString& a3, const TQString& a4 ) const -{ - TQString result; - union { - int digitUsed[10]; - int argForDigit[10]; - }; - register const TQChar *uc = d->tqunicode; - const TQString *args[4]; - const int len = (int) length(); - const int end = len - 1; - int lastDigit = -1; - int i; - - memset( digitUsed, 0, sizeof(digitUsed) ); - args[0] = &a1; - args[1] = &a2; - args[2] = &a3; - args[3] = &a4; - - for ( i = 0; i < end; i++ ) { - if ( uc[i] == '%' ) { - int digit = uc[i + 1].tqunicode() - '0'; - if ( digit >= 0 && digit <= 9 ) - digitUsed[digit]++; - } - } - - for ( i = 0; i < numArgs; i++ ) { - do { - ++lastDigit; - } while ( lastDigit < 10 && digitUsed[lastDigit] == 0 ); - - if ( lastDigit == 10 ) { - qWarning( "TQString::arg(): Argument missing: %s, %s", - latin1(), args[i]->latin1() ); - numArgs = i; - lastDigit = 9; - break; - } - argForDigit[lastDigit] = i; - } - - i = 0; - while ( i < len ) { - if ( uc[i] == '%' && i != end ) { - int digit = uc[i + 1].tqunicode() - '0'; - if ( digit >= 0 && digit <= lastDigit ) { - result += *args[argForDigit[digit]]; - i += 2; - continue; - } - } - result += uc[i++]; - } - return result; -} - - -/*! - Safely builds a formatted string from the format string \a cformat - and an arbitrary list of arguments. The format string supports all - the escape sequences of printf() in the standard C library. - - The %s escape sequence expects a utf8() encoded string. The format - string \e cformat is expected to be in latin1. If you need a - Unicode format string, use arg() instead. For typesafe string - building, with full Unicode support, you can use TQTextOStream like - this: - - \code - TQString str; - TQString s = ...; - int x = ...; - TQTextOStream( &str ) << s << " : " << x; - \endcode - - For \link TQObject::tr() translations,\endlink especially if the - strings contains more than one escape sequence, you should - consider using the arg() function instead. This allows the order - of the replacements to be controlled by the translator, and has - Unicode support. - - The %lc escape sequence expects a tqunicode character of type ushort - (as returned by TQChar::tqunicode()). - The %ls escape sequence expects a pointer to a zero-terminated - array of tqunicode characters of type ushort (as returned by - TQString::ucs2()). - - \sa arg() -*/ - -#ifndef TQT_NO_SPRINTF -TQString &TQString::sprintf( const char* cformat, ... ) -{ - TQLocale locale(TQLocale::C); - - va_list ap; - va_start( ap, cformat ); - - if ( !cformat || !*cformat ) { - // TQt 1.x compat - *this = tqfromLatin1( "" ); - return *this; - } - - // Parse cformat - - TQString result; - const char *c = cformat; - for (;;) { - // Copy non-escape chars to result - while (*c != '\0' && *c != '%') - result.append(*c++); - - if (*c == '\0') - break; - - // Found '%' - const char *escape_start = c; - ++c; - - if (*c == '\0') { - result.append('%'); // a % at the end of the string - treat as non-escape text - break; - } - if (*c == '%') { - result.append('%'); // %% - ++c; - continue; - } - - // Parse flag characters - unsigned flags = 0; - bool no_more_flags = FALSE; - do { - switch (*c) { - case '#': flags |= TQLocalePrivate::Alternate; break; - case '0': flags |= TQLocalePrivate::ZeroPadded; break; - case '-': flags |= TQLocalePrivate::LeftAdjusted; break; - case ' ': flags |= TQLocalePrivate::BlankBeforePositive; break; - case '+': flags |= TQLocalePrivate::AlwaysShowSign; break; - case '\'': flags |= TQLocalePrivate::ThousandsGroup; break; - default: no_more_flags = TRUE; break; - } - - if (!no_more_flags) - ++c; - } while (!no_more_flags); - - if (*c == '\0') { - result.append(escape_start); // incomplete escape, treat as non-escape text - break; - } - - // Parse field width - int width = -1; // -1 means unspecified - if (qIsDigit(*c)) { - TQString width_str; - while (*c != '\0' && qIsDigit(*c)) - width_str.append(*c++); - - // can't be negative - started with a digit - // contains at least one digit - width = width_str.toInt(); - } - else if (*c == '*') { - width = va_arg(ap, int); - if (width < 0) - width = -1; // treat all negative numbers as unspecified - ++c; - } - - if (*c == '\0') { - result.append(escape_start); // incomplete escape, treat as non-escape text - break; - } - - // Parse precision - int precision = -1; // -1 means unspecified - if (*c == '.') { - ++c; - if (qIsDigit(*c)) { - TQString precision_str; - while (*c != '\0' && qIsDigit(*c)) - precision_str.append(*c++); - - // can't be negative - started with a digit - // contains at least one digit - precision = precision_str.toInt(); - } - else if (*c == '*') { - precision = va_arg(ap, int); - if (precision < 0) - precision = -1; // treat all negative numbers as unspecified - ++c; - } - } - - if (*c == '\0') { - result.append(escape_start); // incomplete escape, treat as non-escape text - break; - } - - // Parse the length modifier - enum LengthMod { lm_none, lm_hh, lm_h, lm_l, lm_ll, lm_L, lm_j, lm_z, lm_t }; - LengthMod length_mod = lm_none; - switch (*c) { - case 'h': - ++c; - if (*c == 'h') { - length_mod = lm_hh; - ++c; - } - else - length_mod = lm_h; - break; - - case 'l': - ++c; - if (*c == 'l') { - length_mod = lm_ll; - ++c; - } - else - length_mod = lm_l; - break; - - case 'L': - ++c; - length_mod = lm_L; - break; - - case 'j': - ++c; - length_mod = lm_j; - break; - - case 'z': - case 'Z': - ++c; - length_mod = lm_z; - break; - - case 't': - ++c; - length_mod = lm_t; - break; - - default: break; - } - - if (*c == '\0') { - result.append(escape_start); // incomplete escape, treat as non-escape text - break; - } - - // Parse the conversion specifier and do the conversion - TQString subst; - switch (*c) { - case 'd': - case 'i': { - TQ_LLONG i; - switch (length_mod) { - case lm_none: i = va_arg(ap, int); break; - case lm_hh: i = va_arg(ap, int); break; - case lm_h: i = va_arg(ap, int); break; - case lm_l: i = va_arg(ap, long int); break; - case lm_ll: i = va_arg(ap, TQ_LLONG); break; - case lm_j: i = va_arg(ap, long int); break; - case lm_z: i = va_arg(ap, size_t); break; - case lm_t: i = va_arg(ap, int); break; - default: i = 0; break; - } - subst = locale.d->longLongToString(i, precision, 10, width, flags); - ++c; - break; - } - case 'o': - case 'u': - case 'x': - case 'X': { - TQ_ULLONG u; - switch (length_mod) { - case lm_none: u = va_arg(ap, unsigned int); break; - case lm_hh: u = va_arg(ap, unsigned int); break; - case lm_h: u = va_arg(ap, unsigned int); break; - case lm_l: u = va_arg(ap, unsigned long int); break; - case lm_ll: u = va_arg(ap, TQ_ULLONG); break; - default: u = 0; break; - } - - if (qIsUpper(*c)) - flags |= TQLocalePrivate::CapitalEorX; - - int base = 10; - switch (qToLower(*c)) { - case 'o': - base = 8; break; - case 'u': - base = 10; break; - case 'x': - base = 16; break; - default: break; - } - subst = locale.d->unsLongLongToString(u, precision, base, width, flags); - ++c; - break; - } - case 'E': - case 'e': - case 'F': - case 'f': - case 'G': - case 'g': - case 'A': - case 'a': { - double d; - if (length_mod == lm_L) - d = va_arg(ap, long double); // not supported - converted to a double - else - d = va_arg(ap, double); - - if (qIsUpper(*c)) - flags |= TQLocalePrivate::CapitalEorX; - - TQLocalePrivate::DoubleForm form = TQLocalePrivate::DFDecimal; - switch (qToLower(*c)) { - case 'e': form = TQLocalePrivate::DFExponent; break; - case 'a': // not supported - decimal form used instead - case 'f': form = TQLocalePrivate::DFDecimal; break; - case 'g': form = TQLocalePrivate::DFSignificantDigits; break; - default: break; - } - subst = locale.d->doubleToString(d, precision, form, width, flags); - ++c; - break; - } - case 'c': { - if (length_mod == lm_l) - subst = TQChar((ushort) va_arg(ap, int)); - else - subst = (uchar) va_arg(ap, int); - ++c; - break; - } - case 's': { - if (length_mod == lm_l) { - const ushort *buff = va_arg(ap, const ushort*); - const ushort *ch = buff; - while (*ch != 0) - ++ch; - subst.setUnicodeCodes(buff, ch - buff); - } else - subst = TQString::fromUtf8(va_arg(ap, const char*)); - if (precision != -1) - subst.truncate(precision); - ++c; - break; - } - case 'p': { - TQ_ULLONG i; -#ifdef TQ_OS_WIN64 - i = (TQ_ULLONG) va_arg(ap, void*); -#else - i = (TQ_ULONG) va_arg(ap, void*); -#endif - -#ifdef TQ_OS_WIN32 - flags |= TQLocalePrivate::CapitalEorX; // Windows does 1234ABCD -#else - flags |= TQLocalePrivate::Alternate; // Unix and Mac do 0x1234abcd -#endif - - subst = locale.d->unsLongLongToString(i, precision, 16, width, flags); - ++c; - break; - } - case 'n': - switch (length_mod) { - case lm_hh: { - signed char *n = va_arg(ap, signed char*); - *n = result.length(); - break; - } - case lm_h: { - short int *n = va_arg(ap, short int*); - *n = result.length(); - break; - } - case lm_l: { - long int *n = va_arg(ap, long int*); - *n = result.length(); - break; - } - case lm_ll: { - TQ_LLONG *n = va_arg(ap, TQ_LLONG*); - volatile uint tmp = result.length(); // egcs-2.91.66 gets internal - *n = tmp; // compiler error without volatile - break; - } - default: { - int *n = va_arg(ap, int*); - *n = result.length(); - break; - } - } - ++c; - break; - - default: // bad escape, treat as non-escape text - for (const char *cc = escape_start; cc != c; ++cc) - result.append(*cc); - continue; - } - - if (flags & TQLocalePrivate::LeftAdjusted) - result.append(subst.leftJustify(width)); - else - result.append(subst.rightJustify(width)); - } - - va_end(ap); - *this = result; - - return *this; -} -#endif - -/*! - Fills the string with \a len characters of value \a c, and returns - a reference to the string. - - If \a len is negative (the default), the current string length is - used. - - \code - TQString str; - str.fill( 'g', 5 ); // string == "ggggg" - \endcode -*/ - -TQString& TQString::fill( TQChar c, int len ) -{ - if ( len < 0 ) - len = length(); - if ( len == 0 ) { - *this = ""; - } else { - deref(); - TQChar * nd = TQT_ALLOC_TQCHAR_VEC( len ); - d = new TQStringData(nd,len,len); - while (len--) *nd++ = c; - } - return *this; -} - - -/*! - \fn TQString TQString::copy() const - - \obsolete - - In TQt 2.0 and later, all calls to this function are needless. Just - remove them. -*/ - -/*! - \overload - - Finds the first occurrence of the character \a c, starting at - position \a index. If \a index is -1, the search starts at the - last character; if -2, at the next to last character and so on. - (See findRev() for searching backwards.) - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - Returns the position of \a c or -1 if \a c could not be found. -*/ - -int TQString::find( TQChar c, int index, bool cs ) const -{ - const uint l = length(); - if ( index < 0 ) - index += l; - if ( (uint)index >= l ) - return -1; - register const TQChar *uc = tqunicode()+index; - const TQChar *end = tqunicode() + l; - if ( cs ) { - while ( uc < end && *uc != c ) - uc++; - } else { - c = ::lower( c ); - while ( uc < end && ::lower( *uc ) != c ) - uc++; - } - if ( uint(uc - tqunicode()) >= l ) - return -1; - return (int)(uc - tqunicode()); -} - -/* an implementation of the Boyer-Moore search algorithm -*/ - -/* initializes the skiptable to know haw far ahead we can skip on a wrong match -*/ -static void bm_init_skiptable( const TQString &pattern, uint *skiptable, bool cs ) -{ - int i = 0; - register uint *st = skiptable; - int l = pattern.length(); - while ( i++ < 0x100/8 ) { - *(st++) = l; - *(st++) = l; - *(st++) = l; - *(st++) = l; - *(st++) = l; - *(st++) = l; - *(st++) = l; - *(st++) = l; - } - const TQChar *uc = pattern.tqunicode(); - if ( cs ) { - while ( l-- ) { - skiptable[ uc->cell() ] = l; - uc++; - } - } else { - while ( l-- ) { - skiptable[ ::lower( *uc ).cell() ] = l; - uc++; - } - } -} - -static int bm_find( const TQString &str, int index, const TQString &pattern, uint *skiptable, bool cs ) -{ - const uint l = str.length(); - if ( pattern.isEmpty() ) - return index > (int)l ? -1 : index; - - const TQChar *uc = str.tqunicode(); - const TQChar *puc = pattern.tqunicode(); - const uint pl = pattern.length(); - const uint pl_minus_one = pl - 1; - - register const TQChar *current = uc + index + pl_minus_one; - const TQChar *end = uc + l; - if ( cs ) { - while ( current < end ) { - uint skip = skiptable[ current->cell() ]; - if ( !skip ) { - // possible match - while ( skip < pl ) { - if ( *(current - skip ) != puc[pl_minus_one-skip] ) - break; - skip++; - } - if ( skip > pl_minus_one ) { // we have a match - return (current - uc) - skip + 1; - } - // in case we don't have a match we are a bit inefficient as we only skip by one - // when we have the non matching char in the string. - if ( skiptable[ (current-skip)->cell() ] == pl ) - skip = pl - skip; - else - skip = 1; - } - current += skip; - } - } else { - while ( current < end ) { - uint skip = skiptable[ ::lower( *current ).cell() ]; - if ( !skip ) { - // possible match - while ( skip < pl ) { - if ( ::lower( *(current - skip) ) != ::lower( puc[pl_minus_one-skip] ) ) - break; - skip++; - } - if ( skip > pl_minus_one ) // we have a match - return (current - uc) - skip + 1; - // in case we don't have a match we are a bit inefficient as we only skip by one - // when we have the non matching char in the string. - if ( skiptable[ ::lower(*(current - skip)).cell() ] == pl ) - skip = pl - skip; - else - skip = 1; - } - current += skip; - } - } - // not found - return -1; -} - - -#define REHASH( a ) \ - if ( sl_minus_1 < sizeof(uint) * CHAR_BIT ) \ - hashHaystack -= (a) << sl_minus_1; \ - hashHaystack <<= 1 - -/*! - \overload - - Finds the first occurrence of the string \a str, starting at - position \a index. If \a index is -1, the search starts at the - last character, if it is -2, at the next to last character and so - on. (See findRev() for searching backwards.) - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - Returns the position of \a str or -1 if \a str could not be found. -*/ - -int TQString::find( const TQString& str, int index, bool cs ) const -{ - const uint l = length(); - const uint sl = str.length(); - if ( index < 0 ) - index += l; - if ( sl + index > l ) - return -1; - if ( !sl ) - return index; - if (!l) - return -1; - -#if defined(TQ_OS_MACX) && defined(TQT_MACOSX_VERSION) && TQT_MACOSX_VERSION >= 0x1020 - if ( sl == 1 ) - return find( *str.tqunicode(), index, cs ); -#endif - - // we use the Boyer-Moore algorithm in cases where the overhead - // for the hash table should pay off, otherwise we use a simple - // hash function - if ( l > 500 && sl > 5 ) { - uint skiptable[0x100]; - bm_init_skiptable( str, skiptable, cs ); - return bm_find( *this, index, str, skiptable, cs ); - } - - /* - We use some hashing for efficiency's sake. Instead of - comparing strings, we compare the hash value of str with that of - a part of this TQString. Only if that matches, we call ucstrncmp - or ucstrnicmp. - */ - const TQChar* needle = str.tqunicode(); - const TQChar* haystack = tqunicode() + index; - const TQChar* end = tqunicode() + (l-sl); - const uint sl_minus_1 = sl-1; - uint hashNeedle = 0, hashHaystack = 0, i; - - if ( cs ) { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + needle[i].tqunicode() ); - hashHaystack = ((hashHaystack<<1) + haystack[i].tqunicode() ); - } - hashHaystack -= (haystack+sl_minus_1)->tqunicode(); - - while ( haystack <= end ) { - hashHaystack += (haystack+sl_minus_1)->tqunicode(); - if ( hashHaystack == hashNeedle - && ucstrncmp( needle, haystack, sl ) == 0 ) - return haystack-tqunicode(); - - REHASH( haystack->tqunicode() ); - ++haystack; - } - } else { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + - ::lower( needle[i].tqunicode() ).tqunicode() ); - hashHaystack = ((hashHaystack<<1) + - ::lower( haystack[i].tqunicode() ).tqunicode() ); - } - - hashHaystack -= ::lower(*(haystack+sl_minus_1)).tqunicode(); - while ( haystack <= end ) { - hashHaystack += ::lower(*(haystack+sl_minus_1)).tqunicode(); - if ( hashHaystack == hashNeedle - && ucstrnicmp( needle, haystack, sl ) == 0 ) - return haystack-tqunicode(); - - REHASH( ::lower(*haystack).tqunicode() ); - ++haystack; - } - } - return -1; -} - -/*! - \fn int TQString::findRev( const char* str, int index ) const - - Equivalent to findRev(TQString(\a str), \a index). -*/ - -/*! - \fn int TQString::find( const char* str, int index ) const - - \overload - - Equivalent to find(TQString(\a str), \a index). -*/ - -/*! - \overload - - Finds the first occurrence of the character \a c, starting at - position \a index and searching backwards. If the index is -1, the - search starts at the last character, if it is -2, at the next to - last character and so on. - - Returns the position of \a c or -1 if \a c could not be found. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - \code - TQString string( "bananas" ); - int i = string.findRev( 'a' ); // i == 5 - \endcode -*/ - -int TQString::findRev( TQChar c, int index, bool cs ) const -{ -#if defined(TQ_OS_MACX) && defined(TQT_MACOSX_VERSION) && TQT_MACOSX_VERSION < 0x1020 - return findRev( TQString( c ), index, cs ); -#else - const uint l = length(); - if ( index < 0 ) - index += l; - if ( (uint)index >= l ) - return -1; - const TQChar *end = tqunicode(); - register const TQChar *uc = end + index; - if ( cs ) { - while ( uc >= end && *uc != c ) - uc--; - } else { - c = ::lower( c ); - while ( uc >= end && ::lower( *uc ) != c ) - uc--; - } - return uc - end; -#endif -} - -/*! - \overload - - Finds the first occurrence of the string \a str, starting at - position \a index and searching backwards. If the index is -1, the - search starts at the last character, if it is -2, at the next to - last character and so on. - - Returns the position of \a str or -1 if \a str could not be found. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - \code - TQString string("bananas"); - int i = string.findRev( "ana" ); // i == 3 - \endcode -*/ - -int TQString::findRev( const TQString& str, int index, bool cs ) const -{ - /* - See TQString::find() for explanations. - */ - const uint l = length(); - if ( index < 0 ) - index += l; - const uint sl = str.length(); - int delta = l-sl; - if ( index < 0 || index > (int)l || delta < 0 ) - return -1; - if ( index > delta ) - index = delta; - -#if defined(TQ_OS_MACX) && defined(TQT_MACOSX_VERSION) && TQT_MACOSX_VERSION >= 0x1020 - if ( sl == 1 ) - return findRev( *str.tqunicode(), index, cs ); -#endif - - const TQChar* needle = str.tqunicode(); - const TQChar* haystack = tqunicode() + index; - const TQChar* end = tqunicode(); - const uint sl_minus_1 = sl-1; - const TQChar* n = needle+sl_minus_1; - const TQChar* h = haystack+sl_minus_1; - uint hashNeedle = 0, hashHaystack = 0, i; - - if ( cs ) { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + (n-i)->tqunicode() ); - hashHaystack = ((hashHaystack<<1) + (h-i)->tqunicode() ); - } - hashHaystack -= haystack->tqunicode(); - - while ( haystack >= end ) { - hashHaystack += haystack->tqunicode(); - if ( hashHaystack == hashNeedle - && ucstrncmp( needle, haystack, sl ) == 0 ) - return haystack-tqunicode(); - --haystack; - REHASH( (haystack+sl)->tqunicode() ); - } - } else { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) - + ::lower( (n-i)->tqunicode() ).tqunicode() ); - hashHaystack = ((hashHaystack<<1) - + ::lower( (h-i)->tqunicode() ).tqunicode() ); - } - hashHaystack -= ::lower(*haystack).tqunicode(); - - while ( haystack >= end ) { - hashHaystack += ::lower(*haystack).tqunicode(); - if ( hashHaystack == hashNeedle - && ucstrnicmp( needle, haystack, sl ) == 0 ) - return haystack-tqunicode(); - --haystack; - REHASH( ::lower(*(haystack+sl)).tqunicode() ); - } - } - return -1; -} - -#undef REHASH - -/*! - \enum TQString::SectionFlags - - \value SectionDefault Empty fields are counted, leading and - trailing separators are not included, and the separator is - compared case sensitively. - - \value SectionSkipEmpty Treat empty fields as if they don't exist, - i.e. they are not considered as far as \e start and \e end are - concerned. - - \value SectionIncludeLeadingSep Include the leading separator (if - any) in the result string. - - \value SectionIncludeTrailingSep Include the trailing separator - (if any) in the result string. - - \value SectionCaseInsensitiveSeps Compare the separator - case-insensitively. - - Any of the last four values can be OR-ed together to form a flag. - - \sa section() -*/ - -/*! - \fn TQString TQString::section( TQChar sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const - - This function returns a section of the string. - - This string is treated as a sequence of fields separated by the - character, \a sep. The returned string consists of the fields from - position \a start to position \a end inclusive. If \a end is not - specified, all fields from position \a start to the end of the - string are included. Fields are numbered 0, 1, 2, etc., counting - from the left, and -1, -2, etc., counting from right to left. - - The \a flags argument can be used to affect some aspects of the - function's behaviour, e.g. whether to be case sensitive, whether - to skip empty fields and how to deal with leading and trailing - separators; see \l{SectionFlags}. - - \code - TQString csv( "forename,middlename,surname,phone" ); - TQString s = csv.section( ',', 2, 2 ); // s == "surname" - - TQString path( "/usr/local/bin/myapp" ); // First field is empty - TQString s = path.section( '/', 3, 4 ); // s == "bin/myapp" - TQString s = path.section( '/', 3, 3, SectionSkipEmpty ); // s == "myapp" - \endcode - - If \a start or \a end is negative, we count fields from the right - of the string, the right-most field being -1, the one from - right-most field being -2, and so on. - - \code - TQString csv( "forename,middlename,surname,phone" ); - TQString s = csv.section( ',', -3, -2 ); // s == "middlename,surname" - - TQString path( "/usr/local/bin/myapp" ); // First field is empty - TQString s = path.section( '/', -1 ); // s == "myapp" - \endcode - - \sa TQStringList::split() -*/ - -/*! - \overload - - This function returns a section of the string. - - This string is treated as a sequence of fields separated by the - string, \a sep. The returned string consists of the fields from - position \a start to position \a end inclusive. If \a end is not - specified, all fields from position \a start to the end of the - string are included. Fields are numbered 0, 1, 2, etc., counting - from the left, and -1, -2, etc., counting from right to left. - - The \a flags argument can be used to affect some aspects of the - function's behaviour, e.g. whether to be case sensitive, whether - to skip empty fields and how to deal with leading and trailing - separators; see \l{SectionFlags}. - - \code - TQString data( "forename**middlename**surname**phone" ); - TQString s = data.section( "**", 2, 2 ); // s == "surname" - \endcode - - If \a start or \a end is negative, we count fields from the right - of the string, the right-most field being -1, the one from - right-most field being -2, and so on. - - \code - TQString data( "forename**middlename**surname**phone" ); - TQString s = data.section( "**", -3, -2 ); // s == "middlename**surname" - \endcode - - \sa TQStringList::split() -*/ - -TQString TQString::section( const TQString &sep, int start, int end, int flags ) const -{ - TQStringList sections = TQStringList::split(sep, *this, TRUE); - if(sections.isEmpty()) - return TQString(); - if(!(flags & SectionSkipEmpty)) { - if(start < 0) - start += int(sections.count()); - if(end < 0) - end += int(sections.count()); - } else { - int skip = 0; - for(TQStringList::Iterator it = sections.begin(); it != sections.end(); ++it) { - if((*it).isEmpty()) - skip++; - } - if(start < 0) - start += int(sections.count()) - skip; - if(end < 0) - end += int(sections.count()) - skip; - } - int x = 0, run = 0; - TQString ret; - for(TQStringList::Iterator it = sections.begin(); x <= end && it != sections.end(); ++it) { - if(x >= start) { - if((*it).isEmpty()) { - run++; - } else { - if(!ret.isEmpty() || !(flags & SectionSkipEmpty)) { - int i_end = run; - if(!ret.isEmpty() && !(flags & SectionIncludeTrailingSep)) - i_end++; - if((flags & SectionIncludeLeadingSep) && it != sections.begin() && x == start) - i_end++; - for(int i = 0; i < i_end; i++) - ret += sep; - } else if((flags & SectionIncludeLeadingSep) && it != sections.begin()) { - ret += sep; - } - run = 0; - ret += (*it); - if((flags & SectionIncludeTrailingSep) && it != sections.end()) - ret += sep; - } - } - if(!(*it).isEmpty() || !(flags & SectionSkipEmpty)) - x++; - } - return ret; -} - -#ifndef TQT_NO_REGEXP -class section_chunk { -public: - section_chunk(int l, TQString s) { length = l; string = s; } - int length; - TQString string; -}; -/*! - \overload - - This function returns a section of the string. - - This string is treated as a sequence of fields separated by the - regular expression, \a reg. The returned string consists of the - fields from position \a start to position \a end inclusive. If \a - end is not specified, all fields from position \a start to the end - of the string are included. Fields are numbered 0, 1, 2, etc., counting - from the left, and -1, -2, etc., counting from right to left. - - The \a flags argument can be used to affect some aspects of the - function's behaviour, e.g. whether to be case sensitive, whether - to skip empty fields and how to deal with leading and trailing - separators; see \l{SectionFlags}. - - \code - TQString line( "forename\tmiddlename surname \t \t phone" ); - TQRegExp sep( "\s+" ); - TQString s = line.section( sep, 2, 2 ); // s == "surname" - \endcode - - If \a start or \a end is negative, we count fields from the right - of the string, the right-most field being -1, the one from - right-most field being -2, and so on. - - \code - TQString line( "forename\tmiddlename surname \t \t phone" ); - TQRegExp sep( "\\s+" ); - TQString s = line.section( sep, -3, -2 ); // s == "middlename surname" - \endcode - - \warning Using this TQRegExp version is much more expensive than - the overloaded string and character versions. - - \sa TQStringList::split() simplifyWhiteSpace() -*/ - -TQString TQString::section( const TQRegExp ®, int start, int end, int flags ) const -{ - const TQChar *uc = tqunicode(); - if(!uc) - return TQString(); - - TQRegExp sep(reg); - sep.setCaseSensitive(!(flags & SectionCaseInsensitiveSeps)); - - TQPtrList<section_chunk> l; - l.setAutoDelete(TRUE); - int n = length(), m = 0, last_m = 0, last = 0, last_len = 0; - - while ( ( m = sep.search( *this, m ) ) != -1 ) { - l.append(new section_chunk(last_len, TQString(uc + last_m, m - last_m))); - last_m = m; - last_len = sep.matchedLength(); - if((m += TQMAX(sep.matchedLength(), 1)) >= n) { - last = 1; - break; - } - } - if(!last) - l.append(new section_chunk(last_len, TQString(uc + last_m, n - last_m))); - - if(start < 0) - start = l.count() + start; - if(end == -1) - end = l.count(); - else if(end < 0) - end = l.count() + end; - - int i = 0; - TQString ret; - for ( section_chunk *chk=l.first(); chk; chk=l.next(), i++ ) { - if((flags & SectionSkipEmpty) && chk->length == (int)chk->string.length()) { - if(i <= start) - start++; - end++; - } - if(i == start) { - ret = (flags & SectionIncludeLeadingSep) ? chk->string : chk->string.mid(chk->length); - } else if(i > start) { - ret += chk->string; - } - if(i == end) { - if((chk=l.next()) && flags & SectionIncludeTrailingSep) - ret += chk->string.left(chk->length); - break; - } - } - return ret; -} -#endif - -/*! - \fn TQString TQString::section( char sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const - - \overload -*/ - -/*! - \fn TQString TQString::section( const char *sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const - - \overload -*/ - - -/*! - Returns the number of times the character \a c occurs in the - string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - \code - TQString string( "Trolltech and TQt" ); - int n = string.contains( 't', FALSE ); - // n == 3 - \endcode -*/ - -int TQString::contains( TQChar c, bool cs ) const -{ - int count = 0; - const TQChar *uc = tqunicode(); - if ( !uc ) - return 0; - int n = length(); - if ( cs ) { - while ( n-- ) { - if ( *uc == c ) - count++; - uc++; - } - } else { - c = ::lower( c ); - while ( n-- ) { - if ( ::lower( *uc ) == c ) - count++; - uc++; - } - } - return count; -} - -/*! - \overload - - Returns the number of times the string \a str occurs in the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. -*/ -int TQString::contains( const char* str, bool cs ) const -{ - return contains( TQString(str), cs ); -} - -/*! - \fn int TQString::contains( char c, bool cs ) const - - \overload -*/ - -/*! - \fn int TQString::find( char c, int index, bool cs ) const - - \overload - - Find character \a c starting from position \a index. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. -*/ - -/*! - \fn int TQString::findRev( char c, int index, bool cs ) const - - \overload - - Find character \a c starting from position \a index and working - backwards. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. -*/ - -/*! - \overload - - Returns the number of times \a str occurs in the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - This function counts overlapping strings, so in the example below, - there are two instances of "ana" in "bananas". - - \code - TQString str( "bananas" ); - int i = str.contains( "ana" ); // i == 2 - \endcode - - \sa findRev() -*/ - -int TQString::contains( const TQString &str, bool cs ) const -{ - if ( isNull() ) - return 0; - int count = 0; - uint skiptable[0x100]; - bm_init_skiptable( str, skiptable, cs ); - int i = -1; - // use boyer-moore for the ultimate speed experience - while ( ( i = bm_find( *this, i + 1, str, skiptable, cs ) ) != -1 ) - count++; - return count; -} - -/*! - Returns a substring that contains the \a len leftmost characters - of the string. - - The whole string is returned if \a len exceeds the length of the - string. - - \code - TQString s = "Pineapple"; - TQString t = s.left( 4 ); // t == "Pine" - \endcode - - \sa right(), mid(), isEmpty() -*/ - -TQString TQString::left( uint len ) const -{ - if ( isEmpty() ) { - return TQString(); - } else if ( len == 0 ) { // ## just for 1.x compat: - return tqfromLatin1( "" ); - } else if ( len >= length() ) { - return *this; - } else { - TQString s( len, TRUE ); - memcpy( s.d->tqunicode, d->tqunicode, len * sizeof(TQChar) ); - s.d->len = len; - return s; - } -} - -/*! - Returns a string that contains the \a len rightmost characters of - the string. - - If \a len is greater than the length of the string then the whole - string is returned. - - \code - TQString string( "Pineapple" ); - TQString t = string.right( 5 ); // t == "apple" - \endcode - - \sa left(), mid(), isEmpty() -*/ - -TQString TQString::right( uint len ) const -{ - if ( isEmpty() ) { - return TQString(); - } else if ( len == 0 ) { // ## just for 1.x compat: - return tqfromLatin1( "" ); - } else { - uint l = length(); - if ( len >= l ) - return *this; - TQString s( len, TRUE ); - memcpy( s.d->tqunicode, d->tqunicode+(l-len), len*sizeof(TQChar) ); - s.d->len = len; - return s; - } -} - -/*! - Returns a string that contains the \a len characters of this - string, starting at position \a index. - - Returns a null string if the string is empty or \a index is out of - range. Returns the whole string from \a index if \a index + \a len - exceeds the length of the string. - - \code - TQString s( "Five pineapples" ); - TQString t = s.mid( 5, 4 ); // t == "pine" - \endcode - - \sa left(), right() -*/ - -TQString TQString::mid( uint index, uint len ) const -{ - uint slen = length(); - if ( isEmpty() || index >= slen ) { - return TQString(); - } else if ( len == 0 ) { // ## just for 1.x compat: - return tqfromLatin1( "" ); - } else { - if ( len > slen-index ) - len = slen - index; - if ( index == 0 && len == slen ) - return *this; - register const TQChar *p = tqunicode()+index; - TQString s( len, TRUE ); - memcpy( s.d->tqunicode, p, len * sizeof(TQChar) ); - s.d->len = len; - return s; - } -} - -/*! - Returns a string of length \a width that contains this string - padded by the \a fill character. - - If \a truncate is FALSE and the length of the string is more than - \a width, then the returned string is a copy of the string. - - If \a truncate is TRUE and the length of the string is more than - \a width, then any characters in a copy of the string after length - \a width are removed, and the copy is returned. - - \code - TQString s( "apple" ); - TQString t = s.leftJustify( 8, '.' ); // t == "apple..." - \endcode - - \sa rightJustify() -*/ - -TQString TQString::leftJustify( uint width, TQChar fill, bool truncate ) const -{ - TQString result; - int len = length(); - int padlen = width - len; - if ( padlen > 0 ) { - result.setLength(len+padlen); - if ( len ) - memcpy( result.d->tqunicode, tqunicode(), sizeof(TQChar)*len ); - TQChar* uc = result.d->tqunicode + len; - while (padlen--) - *uc++ = fill; - } else { - if ( truncate ) - result = left( width ); - else - result = *this; - } - return result; -} - -/*! - Returns a string of length \a width that contains the \a fill - character followed by the string. - - If \a truncate is FALSE and the length of the string is more than - \a width, then the returned string is a copy of the string. - - If \a truncate is TRUE and the length of the string is more than - \a width, then the resulting string is truncated at position \a - width. - - \code - TQString string( "apple" ); - TQString t = string.rightJustify( 8, '.' ); // t == "...apple" - \endcode - - \sa leftJustify() -*/ - -TQString TQString::rightJustify( uint width, TQChar fill, bool truncate ) const -{ - TQString result; - int len = length(); - int padlen = width - len; - if ( padlen > 0 ) { - result.setLength( len+padlen ); - TQChar* uc = result.d->tqunicode; - while (padlen--) - *uc++ = fill; - if ( len ) - memcpy( uc, tqunicode(), sizeof(TQChar)*len ); - } else { - if ( truncate ) - result = left( width ); - else - result = *this; - } - return result; -} - -/*! - Returns a lowercase copy of the string. - - \code - TQString string( "TROlltECH" ); - str = string.lower(); // str == "trolltech" - \endcode - - \sa upper() -*/ - -TQString TQString::lower() const -{ - int l = length(); - register TQChar *p = d->tqunicode; - while ( l ) { - if ( *p != ::lower(*p) ) { - TQString s( *this ); - s.real_detach(); - p = s.d->tqunicode + ( p - d->tqunicode ); - while ( l ) { - *p = ::lower( *p ); - l--; - p++; - } - return s; - } - l--; - p++; - } - return *this; -} - -/*! - Returns an uppercase copy of the string. - - \code - TQString string( "TeXt" ); - str = string.upper(); // t == "TEXT" - \endcode - - \sa lower() -*/ - -TQString TQString::upper() const -{ - int l = length(); - register TQChar *p = d->tqunicode; - while ( l ) { - if ( *p != ::upper(*p) ) { - TQString s( *this ); - s.real_detach(); - p = s.d->tqunicode + ( p - d->tqunicode ); - while ( l ) { - *p = ::upper( *p ); - l--; - p++; - } - return s; - } - l--; - p++; - } - return *this; -} - - -/*! - Returns a string that has whitespace removed from the start and - the end. - - Whitespace means any character for which TQChar::isSpace() returns - TRUE. This includes Unicode characters with decimal values 9 - (TAB), 10 (LF), 11 (VT), 12 (FF), 13 (CR) and 32 (Space), and may - also include other Unicode characters. - - \code - TQString string = " white space "; - TQString s = string.stripWhiteSpace(); // s == "white space" - \endcode - - \sa simplifyWhiteSpace() -*/ - -TQString TQString::stripWhiteSpace() const -{ - if ( isEmpty() ) // nothing to do - return *this; - register const TQChar *s = tqunicode(); - if ( !s->isSpace() && !s[length()-1].isSpace() ) - return *this; - - int start = 0; - int end = length() - 1; - while ( start<=end && s[start].isSpace() ) // skip white space from start - start++; - if ( start <= end ) { // only white space - while ( end && s[end].isSpace() ) // skip white space from end - end--; - } - int l = end - start + 1; - if ( l <= 0 ) - return TQString::tqfromLatin1(""); - - TQString result( l, TRUE ); - memcpy( result.d->tqunicode, &s[start], sizeof(TQChar)*l ); - result.d->len = l; - return result; -} - - -/*! - Returns a string that has whitespace removed from the start and - the end, and which has each sequence of internal whitespace - replaced with a single space. - - Whitespace means any character for which TQChar::isSpace() returns - TRUE. This includes Unicode characters with decimal values 9 - (TAB), 10 (LF), 11 (VT), 12 (FF), 13 (CR), and 32 (Space). - - \code - TQString string = " lots\t of\nwhite space "; - TQString t = string.simplifyWhiteSpace(); - // t == "lots of white space" - \endcode - - \sa stripWhiteSpace() -*/ - -TQString TQString::simplifyWhiteSpace() const -{ - if ( isEmpty() ) - return *this; - TQString result; - result.setLength( length() ); - const TQChar *from = tqunicode(); - const TQChar *fromend = from+length(); - int outc=0; - TQChar *to = result.d->tqunicode; - for (;;) { - while ( from!=fromend && from->isSpace() ) - from++; - while ( from!=fromend && !from->isSpace() ) - to[outc++] = *from++; - if ( from!=fromend ) - to[outc++] = ' '; - else - break; - } - if ( outc > 0 && to[outc-1] == ' ' ) - outc--; - result.truncate( outc ); - return result; -} - - -/*! - Inserts \a s into the string at position \a index. - - If \a index is beyond the end of the string, the string is - extended with spaces to length \a index and \a s is then appended - and returns a reference to the string. - - \code - TQString string( "I like fish" ); - str = string.insert( 2, "don't " ); - // str == "I don't like fish" - \endcode - - \sa remove(), replace() -*/ - -TQString &TQString::insert( uint index, const TQString &s ) -{ - // the sub function takes care of &s == this case. - return insert( index, s.tqunicode(), s.length() ); -} - -/*! \fn TQString &TQString::insert( uint index, const TQByteArray &s ) - \overload - - Inserts \a s into the string at position \a index and returns - a reference to the string. -*/ - -/*! \fn TQString &TQString::insert( uint index, const char *s ) - \overload - - Inserts \a s into the string at position \a index and returns - a reference to the string. -*/ - -#ifndef TQT_NO_CAST_ASCII -TQString &TQString::insertHelper( uint index, const char *s, uint len ) -{ - if ( s ) { -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) - return insert( index, fromAscii( s, len ) ); -#endif - if ( len == UINT_MAX ) - len = int(strlen( s )); - if ( len == 0 ) - return *this; - - uint olen = length(); - int nlen = olen + len; - - if ( index >= olen ) { // insert after end of string - grow( len + index ); - int n = index - olen; - TQChar* uc = d->tqunicode + olen; - while ( n-- ) - *uc++ = ' '; - - uc = d->tqunicode + index; - while ( len-- ) - *uc++ = *s++; - } else { // normal insert - grow( nlen ); - memmove( d->tqunicode + index + len, tqunicode() + index, - sizeof(TQChar) * (olen - index) ); - - TQChar* uc = d->tqunicode + index; - while ( len-- ) - *uc++ = *s++; - } - } - return *this; -} -#endif - -/*! - \overload - - Inserts the first \a len characters in \a s into the string at - position \a index and returns a reference to the string. -*/ - -TQString &TQString::insert( uint index, const TQChar* s, uint len ) -{ - if ( len == 0 ) - return *this; - uint olen = length(); - int nlen = olen + len; - - if ( s >= d->tqunicode && (uint)(s - d->tqunicode) < d->maxl ) { - // Part of me - take a copy. - TQChar *tmp = TQT_ALLOC_TQCHAR_VEC( len ); - memcpy(tmp,s,len*sizeof(TQChar)); - insert(index,tmp,len); - TQT_DELETE_TQCHAR_VEC( tmp ); - return *this; - } - - if ( index >= olen ) { // insert after end of string - grow( len + index ); - int n = index - olen; - TQChar* uc = d->tqunicode+olen; - while (n--) - *uc++ = ' '; - memcpy( d->tqunicode+index, s, sizeof(TQChar)*len ); - } else { // normal insert - grow( nlen ); - memmove( d->tqunicode + index + len, tqunicode() + index, - sizeof(TQChar) * (olen - index) ); - memcpy( d->tqunicode + index, s, sizeof(TQChar) * len ); - } - return *this; -} - -/*! - \overload - - Insert \a c into the string at position \a index and returns a - reference to the string. - - If \a index is beyond the end of the string, the string is - extended with spaces (ASCII 32) to length \a index and \a c is - then appended. -*/ - -TQString &TQString::insert( uint index, TQChar c ) // insert char -{ - TQString s( c ); - return insert( index, s ); -} - -/*! - \fn TQString& TQString::insert( uint index, char c ) - - \overload - - Insert character \a c at position \a index. -*/ - -/*! - \fn TQString &TQString::prepend( const TQString &s ) - - Inserts \a s at the beginning of the string and returns a - reference to the string. - - Equivalent to insert(0, \a s). - - \code - TQString string = "42"; - string.prepend( "The answer is " ); - // string == "The answer is 42" - \endcode - - \sa insert() -*/ - -/*! - \fn TQString& TQString::prepend( char ch ) - - \overload - - Inserts \a ch at the beginning of the string and returns a - reference to the string. - - Equivalent to insert(0, \a ch). - - \sa insert() -*/ - -/*! - \fn TQString& TQString::prepend( TQChar ch ) - - \overload - - Inserts \a ch at the beginning of the string and returns a - reference to the string. - - Equivalent to insert(0, \a ch). - - \sa insert() -*/ - -/*! \fn TQString& TQString::prepend( const TQByteArray &s ) - \overload - - Inserts \a s at the beginning of the string and returns a reference to the string. - - Equivalent to insert(0, \a s). - - \sa insert() - */ - -/*! \fn TQString& TQString::prepend( const std::string &s ) - \overload - - Inserts \a s at the beginning of the string and returns a reference to the string. - - Equivalent to insert(0, \a s). - - \sa insert() -*/ - -/*! - \overload - - Inserts \a s at the beginning of the string and returns a reference to the string. - - Equivalent to insert(0, \a s). - - \sa insert() - */ -TQString &TQString::prepend( const char *s ) -{ - return insert( 0, TQString(s) ); -} - -/*! - Removes \a len characters from the string starting at position \a - index, and returns a reference to the string. - - If \a index is beyond the length of the string, nothing happens. - If \a index is within the string, but \a index + \a len is beyond - the end of the string, the string is truncated at position \a - index. - - \code - TQString string( "Montreal" ); - string.remove( 1, 4 ); // string == "Meal" - \endcode - - \sa insert(), replace() -*/ - -TQString &TQString::remove( uint index, uint len ) -{ - uint olen = length(); - if ( index >= olen ) { - // range problems - } else if ( index + len >= olen ) { // index ok - setLength( index ); - } else if ( len != 0 ) { - real_detach(); - memmove( d->tqunicode+index, d->tqunicode+index+len, - sizeof(TQChar)*(olen-index-len) ); - setLength( olen-len ); - } - return *this; -} - -/*! \overload - - Removes every occurrence of the character \a c in the string. - Returns a reference to the string. - - This is the same as replace(\a c, ""). -*/ -TQString &TQString::remove( TQChar c ) -{ - int i = 0; - while ( i < (int) length() ) { - if ( constref(i) == c ) { - remove( i, 1 ); - } else { - i++; - } - } - return *this; -} - -/*! \overload - - \fn TQString &TQString::remove( char c ) - - Removes every occurrence of the character \a c in the string. - Returns a reference to the string. - - This is the same as replace(\a c, ""). -*/ - -/*! \overload - - Removes every occurrence of \a str in the string. Returns a - reference to the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - This is the same as replace(\a str, "", \a cs). -*/ -TQString &TQString::remove( const TQString & str, bool cs ) -{ - if ( str.isEmpty() ) { - if ( isNull() ) - real_detach(); - } else { - int index = 0; - while ( (index = find(str, index, cs)) != -1 ) - remove( index, str.length() ); - } - return *this; -} - -TQString &TQString::remove( const TQString & str ) -{ - return remove( str, TRUE ); -} - -/*! \overload - - Replaces every occurrence of \a c1 with the char \a c2. Returns a - reference to the string. -*/ -TQString &TQString::replace( TQChar c1, TQChar c2 ) -{ - if ( isEmpty() ) - return *this; - - real_detach(); - uint i = 0; - while ( i < d->len ) { - if ( d->tqunicode[i] == c1 ) - d->tqunicode[i] = c2; - i++; - } - return *this; -} - -#ifndef TQT_NO_REGEXP_CAPTURE - -/*! \overload - - Removes every occurrence of the regular expression \a rx in the - string. Returns a reference to the string. - - This is the same as replace(\a rx, ""). -*/ - -TQString &TQString::remove( const TQRegExp & rx ) -{ - return replace( rx, TQString::null ); -} - -#endif - -/*! - \overload - - Removes every occurrence of \a str in the string. Returns a - reference to the string. -*/ -TQString &TQString::remove( const char *str ) -{ - return remove( TQString::fromAscii(str), TRUE ); -} - -/*! - Replaces \a len characters from the string with \a s, starting at - position \a index, and returns a reference to the string. - - If \a index is beyond the length of the string, nothing is deleted - and \a s is appended at the end of the string. If \a index is - valid, but \a index + \a len is beyond the end of the string, - the string is truncated at position \a index, then \a s is - appended at the end. - - \code - TQString string( "Say yes!" ); - string = string.replace( 4, 3, "NO" ); - // string == "Say NO!" - \endcode - - \warning TQt 3.3.3 and earlier had different semantics for the - case \a index >= length(), which contradicted the documentation. - To avoid portability problems between TQt 3 versions and with TQt - 4, we recommend that you never call the function with \a index >= - length(). - - \sa insert(), remove() -*/ - -TQString &TQString::replace( uint index, uint len, const TQString &s ) -{ - return replace( index, len, s.tqunicode(), s.length() ); -} - -/*! \overload - - This is the same as replace(\a index, \a len, TQString(\a c)). -*/ -TQString &TQString::replace( uint index, uint len, TQChar c ) -{ - return replace( index, len, &c, 1 ); -} - -/*! \overload - \fn TQString &TQString::replace( uint index, uint len, char c ) - - This is the same as replace(\a index, \a len, TQChar(\a c)). -*/ - -/*! - \overload - - Replaces \a len characters with \a slen characters of TQChar data - from \a s, starting at position \a index, and returns a reference - to the string. - - \sa insert(), remove() -*/ - -TQString &TQString::replace( uint index, uint len, const TQChar* s, uint slen ) -{ - if (index > length()) - index = length(); - real_detach(); - if ( len == slen && index + len <= length() ) { - // Optimized common case: replace without size change - memcpy( d->tqunicode+index, s, len * sizeof(TQChar) ); - } else if ( s >= d->tqunicode && (uint)(s - d->tqunicode) < d->maxl ) { - // Part of me - take a copy. - TQChar *tmp = TQT_ALLOC_TQCHAR_VEC( slen ); - memcpy( tmp, s, slen * sizeof(TQChar) ); - replace( index, len, tmp, slen ); - TQT_DELETE_TQCHAR_VEC( tmp ); - } else { - remove( index, len ); - insert( index, s, slen ); - } - return *this; -} - -/*! \overload - - Replaces every occurrence of the character \a c in the string - with \a after. Returns a reference to the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - Example: - \code - TQString s = "a,b,c"; - s.replace( TQChar(','), " or " ); - // s == "a or b or c" - \endcode -*/ -TQString &TQString::replace( TQChar c, const TQString & after, bool cs ) -{ - return replace( TQString( c ), after, cs ); -} - -TQString &TQString::replace( TQChar c, const TQString & after ) -{ - return replace( TQString( c ), after, TRUE ); -} - -/*! \overload - \fn TQString &TQString::replace( char c, const TQString & after, bool cs ) - - Replaces every occurrence of the character \a c in the string - with \a after. Returns a reference to the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. -*/ - -/*! \overload - - Replaces every occurrence of the string \a before in the string - with the string \a after. Returns a reference to the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - Example: - \code - TQString s = "Greek is Greek"; - s.replace( "Greek", "English" ); - // s == "English is English" - \endcode -*/ -TQString &TQString::replace( const TQString & before, const TQString & after, - bool cs ) -{ - if ( isEmpty() ) { - if ( !before.isEmpty() ) - return *this; - } else { - if ( cs && before == after ) - return *this; - } - - real_detach(); - - int index = 0; - uint skiptable[256]; - bm_init_skiptable( before, skiptable, cs ); - const int bl = before.length(); - const int al = after.length(); - - if ( bl == al ) { - if ( bl ) { - const TQChar *auc = after.tqunicode(); - while ( (index = bm_find(*this, index, before, skiptable, cs) ) != -1 ) { - memcpy( d->tqunicode + index, auc, al * sizeof(TQChar) ); - index += bl; - } - } - } else if ( al < bl ) { - const TQChar *auc = after.tqunicode(); - uint to = 0; - uint movestart = 0; - uint num = 0; - while ( (index = bm_find(*this, index, before, skiptable, cs)) != -1 ) { - if ( num ) { - int msize = index - movestart; - if ( msize > 0 ) { - memmove( d->tqunicode + to, d->tqunicode + movestart, msize*sizeof(TQChar) ); - to += msize; - } - } else { - to = index; - } - if ( al ) { - memcpy( d->tqunicode+to, auc, al*sizeof(TQChar) ); - to += al; - } - index += bl; - movestart = index; - num++; - } - if ( num ) { - int msize = d->len - movestart; - if ( msize > 0 ) - memmove( d->tqunicode + to, d->tqunicode + movestart, msize*sizeof(TQChar) ); - setLength( d->len - num*(bl-al) ); - } - } else { - // the most complex case. We don't want to loose performance by doing repeated - // copies and reallocs of the string. - while ( index != -1 ) { - uint indices[4096]; - uint pos = 0; - while ( pos < 4095 ) { - index = bm_find( *this, index, before, skiptable, cs ); - if ( index == -1 ) - break; - indices[pos++] = index; - index += bl; - // avoid infinite loop - if ( !bl ) - index++; - } - if ( !pos ) - break; - - // we have a table of replacement positions, use them for fast replacing - int adjust = pos*(al-bl); - // index has to be adjusted in case we get back into the loop above. - if ( index != -1 ) - index += adjust; - uint newlen = d->len + adjust; - int moveend = d->len; - if ( newlen > d->len ) - setLength( newlen ); - - while ( pos ) { - pos--; - int movestart = indices[pos] + bl; - int insertstart = indices[pos] + pos*(al-bl); - int moveto = insertstart + al; - memmove( d->tqunicode + moveto, d->tqunicode + movestart, (moveend - movestart)*sizeof(TQChar) ); - memcpy( d->tqunicode + insertstart, after.tqunicode(), al*sizeof(TQChar) ); - moveend = movestart-bl; - } - } - } - return *this; -} - -TQString &TQString::replace( const TQString & before, const TQString & after ) -{ - return replace( before, after, TRUE ); -} - -#ifndef TQT_NO_REGEXP_CAPTURE -/*! \overload - - Replaces every occurrence of the regexp \a rx in the string with - \a after. Returns a reference to the string. For example: - \code - TQString s = "banana"; - s.replace( TQRegExp("an"), "" ); - // s == "ba" - \endcode - - For regexps containing \link tqregexp.html#capturing-text capturing - parentheses \endlink, occurrences of <b>\\1</b>, <b>\\2</b>, ..., - in \a after are replaced with \a{rx}.cap(1), cap(2), ... - - \code - TQString t = "A <i>bon mot</i>."; - t.replace( TQRegExp("<i>([^<]*)</i>"), "\\emph{\\1}" ); - // t == "A \\emph{bon mot}." - \endcode - - \sa find(), findRev(), TQRegExp::cap() -*/ - -TQString &TQString::replace( const TQRegExp &rx, const TQString &after ) -{ - TQRegExp rx2 = rx; - - if ( isEmpty() && rx2.search(*this) == -1 ) - return *this; - - real_detach(); - - int index = 0; - int numCaptures = rx2.numCaptures(); - int al = after.length(); - TQRegExp::CaretMode caretMode = TQRegExp::CaretAtZero; - - if ( numCaptures > 0 ) { - if ( numCaptures > 9 ) - numCaptures = 9; - - const TQChar *uc = after.tqunicode(); - int numBackRefs = 0; - - for ( int i = 0; i < al - 1; i++ ) { - if ( uc[i] == '\\' ) { - int no = uc[i + 1].digitValue(); - if ( no > 0 && no <= numCaptures ) - numBackRefs++; - } - } - - /* - This is the harder case where we have back-references. - We don't try to optimize it. - */ - if ( numBackRefs > 0 ) { - int *capturePositions = new int[numBackRefs]; - int *captureNumbers = new int[numBackRefs]; - int j = 0; - - for ( int i = 0; i < al - 1; i++ ) { - if ( uc[i] == '\\' ) { - int no = uc[i + 1].digitValue(); - if ( no > 0 && no <= numCaptures ) { - capturePositions[j] = i; - captureNumbers[j] = no; - j++; - } - } - } - - while ( index <= (int)length() ) { - index = rx2.search( *this, index, caretMode ); - if ( index == -1 ) - break; - - TQString after2 = after; - for ( j = numBackRefs - 1; j >= 0; j-- ) - after2.replace( capturePositions[j], 2, - rx2.cap(captureNumbers[j]) ); - - replace( index, rx2.matchedLength(), after2 ); - index += after2.length(); - - if ( rx2.matchedLength() == 0 ) { - // avoid infinite loop on 0-length matches (e.g., [a-z]*) - index++; - } - caretMode = TQRegExp::CaretWontMatch; - } - delete[] capturePositions; - delete[] captureNumbers; - return *this; - } - } - - /* - This is the simple and optimized case where we don't have - back-references. - */ - while ( index != -1 ) { - struct { - int pos; - int length; - } replacements[2048]; - - uint pos = 0; - int adjust = 0; - while ( pos < 2047 ) { - index = rx2.search( *this, index, caretMode ); - if ( index == -1 ) - break; - int ml = rx2.matchedLength(); - replacements[pos].pos = index; - replacements[pos++].length = ml; - index += ml; - adjust += al - ml; - // avoid infinite loop - if ( !ml ) - index++; - } - if ( !pos ) - break; - replacements[pos].pos = d->len; - uint newlen = d->len + adjust; - - // to continue searching at the right position after we did - // the first round of replacements - if ( index != -1 ) - index += adjust; - TQChar *newuc = TQT_ALLOC_TQCHAR_VEC( newlen + 1 ); - TQChar *uc = newuc; - int copystart = 0; - uint i = 0; - while ( i < pos ) { - int copyend = replacements[i].pos; - int size = copyend - copystart; - memcpy( uc, d->tqunicode + copystart, size * sizeof(TQChar) ); - uc += size; - memcpy( uc, after.tqunicode(), al * sizeof(TQChar) ); - uc += al; - copystart = copyend + replacements[i].length; - i++; - } - memcpy( uc, d->tqunicode + copystart, - (d->len - copystart) * sizeof(TQChar) ); - TQT_DELETE_TQCHAR_VEC( d->tqunicode ); - d->tqunicode = newuc; - d->len = newlen; - d->maxl = newlen + 1; - d->setDirty(); - caretMode = TQRegExp::CaretWontMatch; - } - return *this; -} -#endif - -#ifndef TQT_NO_REGEXP -/*! - Finds the first match of the regular expression \a rx, starting - from position \a index. If \a index is -1, the search starts at - the last character; if -2, at the next to last character and so - on. (See findRev() for searching backwards.) - - Returns the position of the first match of \a rx or -1 if no match - was found. - - \code - TQString string( "bananas" ); - int i = string.find( TQRegExp("an"), 0 ); // i == 1 - \endcode - - \sa findRev() replace() contains() -*/ - -int TQString::find( const TQRegExp &rx, int index ) const -{ - return rx.search( *this, index ); -} - -/*! - \overload - - Finds the first match of the regexp \a rx, starting at position \a - index and searching backwards. If the index is -1, the search - starts at the last character, if it is -2, at the next to last - character and so on. (See findRev() for searching backwards.) - - Returns the position of the match or -1 if no match was found. - - \code - TQString string( "bananas" ); - int i = string.findRev( TQRegExp("an") ); // i == 3 - \endcode - - \sa find() -*/ - -int TQString::findRev( const TQRegExp &rx, int index ) const -{ - return rx.searchRev( *this, index ); -} - -/*! - \overload - - Returns the number of times the regexp, \a rx, matches in the - string. - - This function counts overlapping matches, so in the example below, - there are four instances of "ana" or "ama". - - \code - TQString str = "banana and panama"; - TQRegExp rxp = TQRegExp( "a[nm]a", TRUE, FALSE ); - int i = str.contains( rxp ); // i == 4 - \endcode - - \sa find() findRev() -*/ - -int TQString::contains( const TQRegExp &rx ) const -{ - int count = 0; - int index = -1; - int len = length(); - while ( index < len - 1 ) { // count overlapping matches - index = rx.search( *this, index + 1 ); - if ( index == -1 ) - break; - count++; - } - return count; -} - -#endif //TQT_NO_REGEXP - -/*! - Returns the string converted to a \c long using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -long TQString::toLong( bool *ok, int base ) const -{ - TQ_LLONG v = toLongLong( ok, base ); - if ( v < LONG_MIN || v > LONG_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return long(v); -} - -/*! - Returns the string converted to a \c {long long} using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -TQ_LLONG TQString::toLongLong( bool *ok, int base ) const -{ -#if defined(TQT_CHECK_RANGE) - if ( base != 0 && (base < 2 || base > 36) ) { - qWarning( "TQString::toLongLong: Invalid base (%d)", base ); - base = 10; - } -#endif - - bool my_ok; - TQLocale def_locale; - TQ_LLONG result = def_locale.d->stringToLongLong(*this, base, &my_ok, TQLocalePrivate::FailOnGroupSeparators); - if (my_ok) { - if (ok != 0) - *ok = TRUE; - return result; - } - - // If the default was not "C", try the "C" locale - if (def_locale.language() == TQLocale::C) { - if (ok != 0) - *ok = FALSE; - return 0; - } - - TQLocale c_locale(TQLocale::C); - return c_locale.d->stringToLongLong(*this, base, ok, TQLocalePrivate::FailOnGroupSeparators); -} - -/*! - Returns the string converted to an \c {unsigned long} using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -ulong TQString::toULong( bool *ok, int base ) const -{ - TQ_ULLONG v = toULongLong( ok, base ); - if ( v > ULONG_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return ulong(v); -} - -/*! - Returns the string converted to an \c {unsigned long long} using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -TQ_ULLONG TQString::toULongLong( bool *ok, int base ) const -{ -#if defined(TQT_CHECK_RANGE) - if ( base != 0 && (base < 2 || base > 36) ) { - qWarning( "TQString::toULongLong: Invalid base %d", base ); - base = 10; - } -#endif - - bool my_ok; - TQLocale def_locale; - TQ_ULLONG result = def_locale.d->stringToUnsLongLong(*this, base, &my_ok, TQLocalePrivate::FailOnGroupSeparators); - if (my_ok) { - if (ok != 0) - *ok = TRUE; - return result; - } - - // If the default was not "C", try the "C" locale - if (def_locale.language() == TQLocale::C) { - if (ok != 0) - *ok = FALSE; - return 0; - } - - TQLocale c_locale(TQLocale::C); - return c_locale.d->stringToUnsLongLong(*this, base, ok, TQLocalePrivate::FailOnGroupSeparators); -} - -/*! - Returns the string converted to a \c short using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - - -short TQString::toShort( bool *ok, int base ) const -{ - TQ_LLONG v = toLongLong( ok, base ); - if ( v < SHRT_MIN || v > SHRT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (short)v; -} - -/*! - Returns the string converted to an \c {unsigned short} using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -ushort TQString::toUShort( bool *ok, int base ) const -{ - TQ_ULLONG v = toULongLong( ok, base ); - if ( v > USHRT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (ushort)v; -} - - -/*! - Returns the string converted to an \c int using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - \code - TQString str( "FF" ); - bool ok; - int hex = str.toInt( &ok, 16 ); // hex == 255, ok == TRUE - int dec = str.toInt( &ok, 10 ); // dec == 0, ok == FALSE - \endcode - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -int TQString::toInt( bool *ok, int base ) const -{ - TQ_LLONG v = toLongLong( ok, base ); - if ( v < INT_MIN || v > INT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (int)v; -} - -/*! - Returns the string converted to an \c {unsigned int} using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -uint TQString::toUInt( bool *ok, int base ) const -{ - TQ_ULLONG v = toULongLong( ok, base ); - if ( v > UINT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (uint)v; -} - -/*! - Returns the string converted to a \c double value. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - \code - TQString string( "1234.56" ); - double a = string.toDouble(); // a == 1234.56 - \endcode - - The string-to-number functions: - \list - \i toShort() - \i toUShort() - \i toInt() - \i toUInt() - \i toLong() - \i toULong() - \i toLongLong() - \i toULongLong() - \i toFloat() - \i toDouble() - \endlist - can handle numbers - represented in various locales. These representations may use different - characters for the decimal point, thousands group sepearator - and even individual digits. TQString's functions try to interpret - the string according to the current locale. The current locale is - determined from the system at application startup and can be changed - by calling TQLocale::setDefault(). If the string cannot be interpreted - according to the current locale, this function falls back - on the "C" locale. - - \code - bool ok; - double d; - - TQLocale::setDefault(TQLocale::C); - d = TQString( "1234,56" ).toDouble(&ok); // ok == false - d = TQString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56 - - TQLocale::setDefault(TQLocale::German); - d = TQString( "1234,56" ).toDouble(&ok); // ok == true, d == 1234.56 - d = TQString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56 - \endcode - - Due to the ambiguity between the decimal point and thousands group - separator in various locales, these functions do not handle - thousands group separators. If you need to convert such numbers, - use the corresponding function in TQLocale. - - \code - bool ok; - TQLocale::setDefault(TQLocale::C); - double d = TQString( "1,234,567.89" ).toDouble(&ok); // ok == false - \endcode - - \warning If the string contains trailing whitespace this function - will fail, and set \a *ok to false if \a ok is not 0. Leading - whitespace is ignored. - - \sa number() TQLocale::setDefault() TQLocale::toDouble() stripWhiteSpace() -*/ - -double TQString::toDouble( bool *ok ) const -{ - // If there is trailing whitespace, set ok to false but return the correct - // result anyway to preserve behavour of pervious versions of TQt - if (length() > 0 && tqunicode()[length() - 1].isSpace()) { - TQString tmp = stripWhiteSpace(); - if (ok != 0) - *ok = FALSE; - return tmp.toDouble(); - } - - // Try the default locale - bool my_ok; - TQLocale def_locale; - double result = def_locale.d->stringToDouble(*this, &my_ok, TQLocalePrivate::FailOnGroupSeparators); - if (my_ok) { - if (ok != 0) - *ok = TRUE; - return result; - } - - // If the default was not "C", try the "C" locale - if (def_locale.language() == TQLocale::C) { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - - TQLocale c_locale(TQLocale::C); - return c_locale.d->stringToDouble(*this, ok, TQLocalePrivate::FailOnGroupSeparators); -} - -/*! - Returns the string converted to a \c float value. - - Returns 0.0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \warning If the string contains trailing whitespace this function - will fail, settings \a *ok to false if \a ok is not 0. - Leading whitespace is ignored. - - \sa number() -*/ - -#define TQT_MAX_FLOAT 3.4028234663852886e+38 - -float TQString::toFloat( bool *ok ) const -{ - bool myOk; - double d = toDouble(&myOk); - if (!myOk || d > TQT_MAX_FLOAT || d < -TQT_MAX_FLOAT) { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - if (ok != 0) - *ok = TRUE; - return (float) d; -} - -/*! - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. The returned string is in "C" locale. - - The base is 10 by default and must be between 2 and 36. - - \code - TQString string; - string = string.setNum( 1234 ); // string == "1234" - \endcode -*/ - -TQString &TQString::setNum( TQ_LLONG n, int base ) -{ -#if defined(TQT_CHECK_RANGE) - if ( base < 2 || base > 36 ) { - qWarning( "TQString::setNum: Invalid base %d", base ); - base = 10; - } -#endif - TQLocale locale(TQLocale::C); - *this = locale.d->longLongToString(n, -1, base); - return *this; -} - -/*! - \overload - - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. - - The base is 10 by default and must be between 2 and 36. -*/ - -TQString &TQString::setNum( TQ_ULLONG n, int base ) -{ -#if defined(TQT_CHECK_RANGE) - if ( base < 2 || base > 36 ) { - qWarning( "TQString::setNum: Invalid base %d", base ); - base = 10; - } -#endif - TQLocale locale(TQLocale::C); - *this = locale.d->unsLongLongToString(n, -1, base); - return *this; -} - -/*! - \fn TQString &TQString::setNum( long n, int base ) - - \overload -*/ -// ### 4.0: inline -TQString &TQString::setNum( long n, int base ) -{ - return setNum( (TQ_LLONG)n, base ); -} - -/*! - \fn TQString &TQString::setNum( ulong n, int base ) - - \overload -*/ -// ### 4.0: inline -TQString &TQString::setNum( ulong n, int base ) -{ - return setNum( (TQ_ULLONG)n, base ); -} - -/*! - \fn TQString &TQString::setNum( int n, int base ) - - \overload - - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. - - The base is 10 by default and must be between 2 and 36. -*/ - -/*! - \fn TQString &TQString::setNum( uint n, int base ) - - \overload - - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. - - The base is 10 by default and must be between 2 and 36. -*/ - -/*! - \fn TQString &TQString::setNum( short n, int base ) - - \overload - - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. - - The base is 10 by default and must be between 2 and 36. -*/ - -/*! - \fn TQString &TQString::setNum( ushort n, int base ) - - \overload - - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. - - The base is 10 by default and must be between 2 and 36. -*/ - -/*! - \overload - - Sets the string to the printed value of \a n, formatted in format - \a f with precision \a prec, and returns a reference to the - string. - - The format \a f can be 'f', 'F', 'e', 'E', 'g' or 'G'. See \link - #arg-formats arg \endlink() for an explanation of the formats. -*/ - -TQString &TQString::setNum( double n, char f, int prec ) -{ - TQLocalePrivate::DoubleForm form = TQLocalePrivate::DFDecimal; - uint flags = 0; - - if (qIsUpper(f)) - flags = TQLocalePrivate::CapitalEorX; - f = qToLower(f); - - switch (f) { - case 'f': - form = TQLocalePrivate::DFDecimal; - break; - case 'e': - form = TQLocalePrivate::DFExponent; - break; - case 'g': - form = TQLocalePrivate::DFSignificantDigits; - break; - default: -#if defined(TQT_CHECK_RANGE) - qWarning( "TQString::setNum: Invalid format char '%c'", f ); -#endif - break; - } - - TQLocale locale(TQLocale::C); - *this = locale.d->doubleToString(n, prec, form, -1, flags); - return *this; -} - -/*! - \fn TQString &TQString::setNum( float n, char f, int prec ) - - \overload - - Sets the string to the printed value of \a n, formatted in format - \a f with precision \a prec, and returns a reference to the - string. - - The format \a f can be 'f', 'F', 'e', 'E', 'g' or 'G'. See \link - #arg-formats arg \endlink() for an explanation of the formats. -*/ - - -/*! - A convenience function that returns a string equivalent of the - number \a n to base \a base, which is 10 by default and must be - between 2 and 36. The returned string is in "C" locale. - - \code - long a = 63; - TQString str = TQString::number( a, 16 ); // str == "3f" - TQString str = TQString::number( a, 16 ).upper(); // str == "3F" - \endcode - - \sa setNum() -*/ -TQString TQString::number( long n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - \sa setNum() -*/ -TQString TQString::number( ulong n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - \sa setNum() -*/ -TQString TQString::number( TQ_LLONG n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - \sa setNum() -*/ -TQString TQString::number( TQ_ULLONG n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - \sa setNum() -*/ -TQString TQString::number( int n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - A convenience factory function that returns a string - representation of the number \a n to the base \a base, which is 10 - by default and must be between 2 and 36. - - \sa setNum() -*/ -TQString TQString::number( uint n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - Argument \a n is formatted according to the \a f format specified, - which is \c g by default, and can be any of the following: - - \table - \header \i Format \i Meaning - \row \i \c e \i format as [-]9.9e[+|-]999 - \row \i \c E \i format as [-]9.9E[+|-]999 - \row \i \c f \i format as [-]9.9 - \row \i \c g \i use \c e or \c f format, whichever is the most concise - \row \i \c G \i use \c E or \c f format, whichever is the most concise - \endtable - - With 'e', 'E', and 'f', \a prec is the number of digits after the - decimal point. With 'g' and 'G', \a prec is the maximum number of - significant digits (trailing zeroes are omitted). - - \code - double d = 12.34; - TQString ds = TQString( "'E' format, precision 3, gives %1" ) - .arg( d, 0, 'E', 3 ); - // ds == "1.234E+001" - \endcode - - \sa setNum() - */ -TQString TQString::number( double n, char f, int prec ) -{ - TQString s; - s.setNum( n, f, prec ); - return s; -} - - -/*! \obsolete - - Sets the character at position \a index to \a c and expands the - string if necessary, filling with spaces. - - This method is redundant in TQt 3.x, because operator[] will expand - the string as necessary. -*/ - -void TQString::setExpand( uint index, TQChar c ) -{ - int spaces = index - d->len; - at(index) = c; - while (spaces-->0) - d->tqunicode[--index]=' '; -} - - -/*! - \fn const char* TQString::data() const - - \obsolete - - Returns a pointer to a '\0'-terminated classic C string. - - In TQt 1.x, this returned a char* allowing direct manipulation of the - string as a sequence of bytes. In TQt 2.x where TQString is a Unicode - string, char* conversion constructs a temporary string, and hence - direct character operations are meaningless. -*/ - -/*! - \fn bool TQString::operator!() const - - Returns TRUE if this is a null string; otherwise returns FALSE. - - \code - TQString name = getName(); - if ( !name ) - name = "Rodney"; - \endcode - - Note that if you say - - \code - TQString name = getName(); - if ( name ) - doSomethingWith(name); - \endcode - - It will call "operator const char*()", which is inefficent; you - may wish to define the macro \c TQT_NO_ASCII_CAST when writing code - which you wish to remain Unicode-clean. - - When you want the above semantics, use: - - \code - TQString name = getName(); - if ( !name.isNull() ) - doSomethingWith(name); - \endcode - - \sa isEmpty() -*/ - - -/*! - \fn TQString& TQString::append( const TQString& str ) - - Appends \a str to the string and returns a reference to the - result. - - \code - string = "Test"; - string.append( "ing" ); // string == "Testing" - \endcode - - Equivalent to operator+=(). -*/ - -/*! - \fn TQString& TQString::append( char ch ) - - \overload - - Appends character \a ch to the string and returns a reference to - the result. - - Equivalent to operator+=(). -*/ - -/*! - \fn TQString& TQString::append( TQChar ch ) - - \overload - - Appends character \a ch to the string and returns a reference to - the result. - - Equivalent to operator+=(). -*/ - -/*! \fn TQString& TQString::append( const TQByteArray &str ) - \overload - - Appends \a str to the string and returns a reference to the result. - - Equivalent to operator+=(). -*/ - -/*! \fn TQString& TQString::append( const std::string &str ) - \overload - - Appends \a str to the string and returns a reference to the result. - - Equivalent to operator+=(). -*/ - -/*! \fn TQString& TQString::append( const char *str ) - \overload - - Appends \a str to the string and returns a reference to the result. - - Equivalent to operator+=(). -*/ - -/*! - Appends \a str to the string and returns a reference to the string. -*/ -TQString& TQString::operator+=( const TQString &str ) -{ - uint len1 = length(); - uint len2 = str.length(); - if ( len2 ) { - if ( isEmpty() ) { - operator=( str ); - } else { - grow( len1+len2 ); - memcpy( d->tqunicode+len1, str.tqunicode(), sizeof(TQChar)*len2 ); - } - } else if ( isNull() && !str.isNull() ) { // ## just for 1.x compat: - *this = tqfromLatin1( "" ); - } - return *this; -} - -#ifndef TQT_NO_CAST_ASCII -TQString &TQString::operatorPlusEqHelper( const char *s, uint len2 ) -{ - if ( s ) { -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) - return operator+=( fromAscii( s, len2 ) ); -#endif - - uint len1 = length(); - if ( len2 == UINT_MAX ) - len2 = int(strlen( s )); - if ( len2 ) { - grow( len1 + len2 ); - TQChar* uc = d->tqunicode + len1; - while ( len2-- ) - *uc++ = *s++; - } else if ( isNull() ) { // ## just for 1.x compat: - *this = tqfromLatin1( "" ); - } - } - return *this; -} -#endif - -/*! - \overload - - Appends \a str to the string and returns a reference to the string. -*/ -#ifndef TQT_NO_CAST_ASCII -TQString& TQString::operator+=( const char *str ) -{ - // ### TQt 4: make this function inline - return operatorPlusEqHelper( str ); -} -#endif - -/*! \overload - - Appends \a c to the string and returns a reference to the string. -*/ - -TQString &TQString::operator+=( TQChar c ) -{ - grow( length()+1 ); - d->tqunicode[length()-1] = c; - return *this; -} - -/*! - \overload - - Appends \a c to the string and returns a reference to the string. -*/ - -TQString &TQString::operator+=( char c ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) - return operator+=( fromAscii( &c, 1 ) ); -#endif - grow( length()+1 ); - d->tqunicode[length()-1] = c; - return *this; -} - -/*! - \fn TQString &TQString::operator+=( const TQByteArray &str ) - \overload - - Appends \a str to the string and returns a reference to the string. -*/ - -/*! - \fn TQString &TQString::operator+=( const std::string &str ) - \overload - - Appends \a str to the string and returns a reference to the string. -*/ - -/*! - \fn char TQChar::latin1() const - - Returns the Latin-1 value of this character, or 0 if it - cannot be represented in Latin-1. -*/ - - -/*! - Returns a Latin-1 representation of the string. The - returned value is undefined if the string contains non-Latin-1 - characters. If you want to convert strings into formats other than - Unicode, see the TQTextCodec classes. - - This function is mainly useful for boot-strapping legacy code to - use Unicode. - - The result remains valid so long as one unmodified copy of the - source string exists. - - \sa tqfromLatin1(), ascii(), utf8(), local8Bit() -*/ -const char* TQString::latin1() const -{ - if ( !d->ascii || !d->islatin1 ) { - delete [] d->ascii; - d->ascii = tqunicodeToLatin1( d->tqunicode, d->len ); - d->islatin1 = TRUE; - } - return d->ascii; -} - -/*! - Returns an 8-bit ASCII representation of the string. - - If a codec has been set using TQTextCodec::codecForCStrings(), - it is used to convert Unicode to 8-bit char. Otherwise, this function - does the same as latin1(). - - \sa fromAscii(), latin1(), utf8(), local8Bit() -*/ -const char* TQString::ascii() const -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - if ( !d->ascii || d->islatin1 ) { - delete [] d->ascii; - if (d->tqunicode) { - TQCString s = TQTextCodec::codecForCStrings()->fromUnicode( *this ); - d->ascii = new char[s.length() + 1]; - memcpy(d->ascii, s.data(), s.length() + 1); - } else { - d->ascii = 0; - } - d->islatin1 = FALSE; - } - return d->ascii; - } -#endif // TQT_NO_TEXTCODEC - return latin1(); -} - -/*! - Returns the string encoded in UTF-8 format. - - See TQTextCodec for more diverse coding/decoding of Unicode strings. - - \sa fromUtf8(), ascii(), latin1(), local8Bit() -*/ -TQCString TQString::utf8() const -{ - int l = length(); - int rlen = l*3+1; - TQCString rstr(rlen); - uchar* cursor = (uchar*)rstr.data(); - const TQChar *ch = d->tqunicode; - for (int i=0; i < l; i++) { - uint u = ch->tqunicode(); - if ( u < 0x80 ) { - *cursor++ = (uchar)u; - } else { - if ( u < 0x0800 ) { - *cursor++ = 0xc0 | ((uchar) (u >> 6)); - } else { - if (u >= 0xd800 && u < 0xdc00 && i < l-1) { - unsigned short low = ch[1].tqunicode(); - if (low >= 0xdc00 && low < 0xe000) { - ++ch; - ++i; - u = (u - 0xd800)*0x400 + (low - 0xdc00) + 0x10000; - } - } - if (u > 0xffff) { - // if people are working in utf8, but strings are encoded in eg. latin1, the resulting - // name might be invalid utf8. This and the corresponding code in fromUtf8 takes care - // we can handle this without loosing information. This can happen with latin filenames - // and a utf8 locale under Unix. - if (u > 0x10fe00 && u < 0x10ff00) { - *cursor++ = (u - 0x10fe00); - ++ch; - continue; - } else { - *cursor++ = 0xf0 | ((uchar) (u >> 18)); - *cursor++ = 0x80 | ( ((uchar) (u >> 12)) & 0x3f); - } - } else { - *cursor++ = 0xe0 | ((uchar) (u >> 12)); - } - *cursor++ = 0x80 | ( ((uchar) (u >> 6)) & 0x3f); - } - *cursor++ = 0x80 | ((uchar) (u&0x3f)); - } - ++ch; - } - rstr.truncate( cursor - (uchar*)rstr.data() ); - return rstr; -} - -static TQChar *addOne(TQChar *qch, TQString &str) -{ - long sidx = qch - str.tqunicode(); - str.setLength(str.length()+1); - return (TQChar *)str.tqunicode() + sidx; -} - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a utf8, ignoring the rest of \a utf8. If \a len is - -1 then the length of \a utf8 is used. If \a len is bigger than - the length of \a utf8 then it will use the length of \a utf8. - - \code - TQString str = TQString::fromUtf8( "123456789", 5 ); - // str == "12345" - \endcode - - See TQTextCodec for more diverse coding/decoding of Unicode strings. -*/ -TQString TQString::fromUtf8( const char* utf8, int len ) -{ - if ( !utf8 ) - return TQString::null; - - int slen = 0; - if (len >= 0) { - while (slen < len && utf8[slen]) - slen++; - } else { - slen = int(strlen(utf8)); - } - len = len < 0 ? slen : TQMIN(slen, len); - TQString result; - result.setLength( len ); // worst case - TQChar *qch = (TQChar *)result.tqunicode(); - uint uc = 0; - uint min_uc = 0; - int need = 0; - int error = -1; - uchar ch; - for (int i=0; i<len; i++) { - ch = utf8[i]; - if (need) { - if ( (ch&0xc0) == 0x80 ) { - uc = (uc << 6) | (ch & 0x3f); - need--; - if ( !need ) { - if (uc > 0xffff) { - // surrogate pair - uc -= 0x10000; - unsigned short high = uc/0x400 + 0xd800; - unsigned short low = uc%0x400 + 0xdc00; - *qch++ = TQChar(high); - *qch++ = TQChar(low); - } else if (uc < min_uc || (uc >= 0xd800 && uc <= 0xdfff) || (uc >= 0xfffe)) { - // overlong seqence, UTF16 surrogate or BOM - i = error; - qch = addOne(qch, result); - *qch++ = TQChar(0xdbff); - *qch++ = TQChar(0xde00+((uchar)utf8[i])); - } else { - *qch++ = uc; - } - } - } else { - // See TQString::utf8() for explanation. - // - // The surrogate below corresponds to a Unicode value of (0x10fe00+ch) which - // is in one of the private use areas of Unicode. - i = error; - qch = addOne(qch, result); - *qch++ = TQChar(0xdbff); - *qch++ = TQChar(0xde00+((uchar)utf8[i])); - need = 0; - } - } else { - if ( ch < 128 ) { - *qch++ = ch; - } else if ((ch & 0xe0) == 0xc0) { - uc = ch & 0x1f; - need = 1; - error = i; - min_uc = 0x80; - } else if ((ch & 0xf0) == 0xe0) { - uc = ch & 0x0f; - need = 2; - error = i; - min_uc = 0x800; - } else if ((ch&0xf8) == 0xf0) { - uc = ch & 0x07; - need = 3; - error = i; - min_uc = 0x10000; - } else { - // Error - qch = addOne(qch, result); - *qch++ = TQChar(0xdbff); - *qch++ = TQChar(0xde00+((uchar)utf8[i])); - } - } - } - if (need) { - // we have some invalid characters remaining we need to add to the string - for (int i = error; i < len; ++i) { - qch = addOne(qch, result); - *qch++ = TQChar(0xdbff); - *qch++ = TQChar(0xde00+((uchar)utf8[i])); - } - } - - result.truncate( qch - result.tqunicode() ); - return result; -} - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a ascii, ignoring the rest of \a ascii. If \a len - is -1 then the length of \a ascii is used. If \a len is bigger - than the length of \a ascii then it will use the length of \a - ascii. - - If a codec has been set using TQTextCodec::codecForCStrings(), - it is used to convert the string from 8-bit characters to Unicode. - Otherwise, this function does the same as tqfromLatin1(). - - This is the same as the TQString(const char*) constructor, but you - can make that constructor invisible if you compile with the define - \c TQT_NO_CAST_ASCII, in which case you can explicitly create a - TQString from 8-bit ASCII text using this function. - - \code - TQString str = TQString::fromAscii( "123456789", 5 ); - // str == "12345" - \endcode - */ -TQString TQString::fromAscii( const char* ascii, int len ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - if ( !ascii ) - return TQString::null; - if ( len < 0 ) - len = (int)strlen( ascii ); - if ( len == 0 || *ascii == '\0' ) - return TQString::tqfromLatin1( "" ); - return TQTextCodec::codecForCStrings()->toUnicode( ascii, len ); - } -#endif - return tqfromLatin1( ascii, len ); -} - - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a chars, ignoring the rest of \a chars. If \a len - is -1 then the length of \a chars is used. If \a len is bigger - than the length of \a chars then it will use the length of \a - chars. - - \sa fromAscii() -*/ -TQString TQString::tqfromLatin1( const char* chars, int len ) -{ - uint l; - TQChar *uc; - if ( len < 0 ) - len = -1; - uc = internalLatin1ToUnicode( chars, &l, len ); - return TQString( new TQStringData(uc, l, l), TRUE ); -} - -/*! - \fn const TQChar* TQString::tqunicode() const - - Returns the Unicode representation of the string. The result - remains valid until the string is modified. -*/ - -/*! - Returns the string encoded in a locale-specific format. On X11, - this is the TQTextCodec::codecForLocale(). On Windows, it is a - system-defined encoding. On Mac OS X, this always uses UTF-8 as - the encoding. - - See TQTextCodec for more diverse coding/decoding of Unicode - strings. - - \sa fromLocal8Bit(), ascii(), latin1(), utf8() -*/ - -TQCString TQString::local8Bit() const -{ -#ifdef TQT_NO_TEXTCODEC - return latin1(); -#else -#ifdef TQ_WS_X11 - TQTextCodec* codec = TQTextCodec::codecForLocale(); - return codec - ? codec->fromUnicode(*this) - : TQCString(latin1()); -#endif -#if defined( TQ_WS_MACX ) - return utf8(); -#endif -#if defined( TQ_WS_MAC9 ) - return TQCString(latin1()); //I'm evil.. -#endif -#ifdef TQ_WS_WIN - return isNull() ? TQCString("") : qt_winTQString2MB( *this ); -#endif -#ifdef TQ_WS_TQWS - return utf8(); // ### if there is any 8 bit format supported? -#endif -#endif -} - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a local8Bit, ignoring the rest of \a local8Bit. If - \a len is -1 then the length of \a local8Bit is used. If \a len is - bigger than the length of \a local8Bit then it will use the length - of \a local8Bit. - - \code - TQString str = TQString::fromLocal8Bit( "123456789", 5 ); - // str == "12345" - \endcode - - \a local8Bit is assumed to be encoded in a locale-specific format. - - See TQTextCodec for more diverse coding/decoding of Unicode strings. -*/ -TQString TQString::fromLocal8Bit( const char* local8Bit, int len ) -{ -#ifdef TQT_NO_TEXTCODEC - return tqfromLatin1( local8Bit, len ); -#else - - if ( !local8Bit ) - return TQString::null; -#ifdef TQ_WS_X11 - TQTextCodec* codec = TQTextCodec::codecForLocale(); - if ( len < 0 ) - len = strlen( local8Bit ); - return codec - ? codec->toUnicode( local8Bit, len ) - : tqfromLatin1( local8Bit, len ); -#endif -#if defined( TQ_WS_MAC ) - return fromUtf8(local8Bit,len); -#endif -// Should this be OS_WIN32? -#ifdef TQ_WS_WIN - if ( len >= 0 ) { - TQCString s(local8Bit,len+1); - return qt_winMB2TQString(s); - } - return qt_winMB2TQString( local8Bit ); -#endif -#ifdef TQ_WS_TQWS - return fromUtf8(local8Bit,len); -#endif -#endif // TQT_NO_TEXTCODEC -} - -/*! - \fn TQString::operator const char *() const - - Returns ascii(). Be sure to see the warnings documented in the - ascii() function. Note that for new code which you wish to be - strictly Unicode-clean, you can define the macro \c - TQT_NO_ASCII_CAST when compiling your code to hide this function so - that automatic casts are not done. This has the added advantage - that you catch the programming error described in operator!(). -*/ - -/*! - \fn TQString::operator std::string() const - - Returns ascii() as a std::string. - - \warning The function may cause an application to crash if a static C run-time is in use. - This can happen in Microsoft Visual C++ if TQt is configured as single-threaded. A safe - alternative is to call ascii() directly and construct a std::string manually. -*/ - -/*! - Returns the TQString as a zero terminated array of unsigned shorts - if the string is not null; otherwise returns zero. - - The result remains valid so long as one unmodified - copy of the source string exists. -*/ -const unsigned short *TQString::ucs2() const -{ - if ( ! d->tqunicode ) - return 0; - unsigned int len = d->len; - if ( d->maxl < len + 1 ) { - // detach, grow or shrink - uint newMax = computeNewMax( len + 1 ); - TQChar* nd = TQT_ALLOC_TQCHAR_VEC( newMax ); - if ( nd ) { - if ( d->tqunicode ) - memcpy( nd, d->tqunicode, sizeof(TQChar)*len ); - ((TQString *)this)->deref(); - ((TQString *)this)->d = new TQStringData( nd, len, newMax ); - } - } - d->tqunicode[len] = 0; - return (unsigned short *) d->tqunicode; -} - -/*! - Constructs a string that is a deep copy of \a str, interpreted as a - UCS2 encoded, zero terminated, Unicode string. - - If \a str is 0, then a null string is created. - - \sa isNull() -*/ -TQString TQString::fromUcs2( const unsigned short *str ) -{ - if ( !str ) { - return TQString::null; - } else { - int length = 0; - while ( str[length] != 0 ) - length++; - TQChar* uc = TQT_ALLOC_TQCHAR_VEC( length ); - memcpy( uc, str, length*sizeof(TQChar) ); - return TQString( new TQStringData( uc, length, length ), TRUE ); - } -} - -/*! - \fn TQChar TQString::at( uint ) const - - Returns the character at index \a i, or 0 if \a i is beyond the - length of the string. - - \code - const TQString string( "abcdefgh" ); - TQChar ch = string.at( 4 ); - // ch == 'e' - \endcode - - If the TQString is not const (i.e. const TQString) or const& (i.e. - const TQString &), then the non-const overload of at() will be used - instead. -*/ - -/*! - \fn TQChar TQString::constref(uint i) const - - Returns the TQChar at index \a i by value. - - Equivalent to at(\a i). - - \sa ref() -*/ - -/*! - \fn TQChar& TQString::ref(uint i) - - Returns the TQChar at index \a i by reference, expanding the string - with TQChar::null if necessary. The resulting reference can be - assigned to, or otherwise used immediately, but becomes invalid - once furher modifications are made to the string. - - \code - TQString string("ABCDEF"); - TQChar ch = string.ref( 3 ); // ch == 'D' - \endcode - - \sa constref() -*/ - -/*! - \fn TQChar TQString::operator[]( int ) const - - Returns the character at index \a i, or TQChar::null if \a i is - beyond the length of the string. - - If the TQString is not const (i.e., const TQString) or const\& - (i.e., const TQString\&), then the non-const overload of operator[] - will be used instead. -*/ - -/*! - \fn TQCharRef TQString::operator[]( int ) - - \overload - - The function returns a reference to the character at index \a i. - The resulting reference can then be assigned to, or used - immediately, but it will become invalid once further modifications - are made to the original string. - - If \a i is beyond the length of the string then the string is - expanded with TQChar::nulls, so that the TQCharRef references a - valid (null) character in the string. - - The TQCharRef internal class can be used much like a constant - TQChar, but if you assign to it, you change the original string - (which will detach itself because of TQString's copy-on-write - semantics). You will get compilation errors if you try to use the - result as anything but a TQChar. -*/ - -/*! - \fn TQCharRef TQString::at( uint i ) - - \overload - - The function returns a reference to the character at index \a i. - The resulting reference can then be assigned to, or used - immediately, but it will become invalid once further modifications - are made to the original string. - - If \a i is beyond the length of the string then the string is - expanded with TQChar::null. -*/ - -/* - Internal chunk of code to handle the - uncommon cases of at() above. -*/ -void TQString::subat( uint i ) -{ - uint olen = d->len; - if ( i >= olen ) { - setLength( i+1 ); // i is index; i+1 is needed length - for ( uint j=olen; j<=i; j++ ) - d->tqunicode[j] = TQChar::null; - } else { - // Just be sure to detach - real_detach(); - } -} - - -/*! - Resizes the string to \a len characters and copies \a tqunicode into - the string. If \a tqunicode is 0, nothing is copied, but the - string is still resized to \a len. If \a len is zero, then the - string becomes a \link isNull() null\endlink string. - - \sa setLatin1(), isNull() -*/ - -TQString& TQString::setUnicode( const TQChar *tqunicode, uint len ) -{ - if ( len == 0 ) { // set to null string - if ( d != shared_null ) { // beware of nullstring being set to nullstring - deref(); - d = shared_null ? shared_null : makeSharedNull(); - d->ref(); - } - } else if ( d->count != 1 || len > d->maxl || - ( len * 4 < d->maxl && d->maxl > 4 ) ) { - // detach, grown or shrink - uint newMax = computeNewMax( len ); - TQChar* nd = TQT_ALLOC_TQCHAR_VEC( newMax ); - if ( tqunicode ) - memcpy( nd, tqunicode, sizeof(TQChar)*len ); - deref(); - d = new TQStringData( nd, len, newMax ); - } else { - d->len = len; - d->setDirty(); - if ( tqunicode ) - memcpy( d->tqunicode, tqunicode, sizeof(TQChar)*len ); - } - return *this; -} - -/*! - Resizes the string to \a len characters and copies \a - tqunicode_as_ushorts into the string (on some X11 client platforms - this will involve a byte-swapping pass). - - If \a tqunicode_as_ushorts is 0, nothing is copied, but the string - is still resized to \a len. If \a len is zero, the string becomes - a \link isNull() null\endlink string. - - \sa setLatin1(), isNull() -*/ -TQString& TQString::setUnicodeCodes( const ushort* tqunicode_as_ushorts, uint len ) -{ - return setUnicode((const TQChar*)tqunicode_as_ushorts, len); -} - - -/*! - Sets this string to \a str, interpreted as a classic 8-bit ASCII C - string. If \a len is -1 (the default), then it is set to - strlen(str). - - If \a str is 0 a null string is created. If \a str is "", an empty - string is created. - - \sa isNull(), isEmpty() -*/ - -TQString &TQString::setAscii( const char *str, int len ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - *this = TQString::fromAscii( str, len ); - return *this; - } -#endif // TQT_NO_TEXTCODEC - return setLatin1( str, len ); -} - -/*! - Sets this string to \a str, interpreted as a classic Latin-1 C - string. If \a len is -1 (the default), then it is set to - strlen(str). - - If \a str is 0 a null string is created. If \a str is "", an empty - string is created. - - \sa isNull(), isEmpty() -*/ - -TQString &TQString::setLatin1( const char *str, int len ) -{ - if ( str == 0 ) - return setUnicode(0,0); - if ( len < 0 ) - len = int(strlen( str )); - if ( len == 0 ) { // won't make a null string - *this = TQString::tqfromLatin1( "" ); - } else { - setUnicode( 0, len ); // resize but not copy - TQChar *p = d->tqunicode; - while ( len-- ) - *p++ = *str++; - } - return *this; -} - -/*! \internal - */ -void TQString::checkSimpleText() const -{ - TQChar *p = d->tqunicode; - TQChar *end = p + d->len; - while ( p < end ) { - ushort uc = p->tqunicode(); - // sort out regions of complex text formatting - if ( uc > 0x058f && ( uc < 0x1100 || uc > 0xfb0f ) ) { - d->issimpletext = FALSE; - return; - } - p++; - } - d->issimpletext = TRUE; -} - -/*! \fn bool TQString::simpleText() const - \internal -*/ - -/*! \internal - */ -bool TQString::isRightToLeft() const -{ - int len = length(); - TQChar *p = d->tqunicode; - while ( len-- ) { - switch( ::direction( *p ) ) - { - case TQChar::DirL: - case TQChar::DirLRO: - case TQChar::DirLRE: - return FALSE; - case TQChar::DirR: - case TQChar::DirAL: - case TQChar::DirRLO: - case TQChar::DirRLE: - return TRUE; - default: - break; - } - ++p; - } - return FALSE; -} - - -/*! - \fn int TQString::compare( const TQString & s1, const TQString & s2 ) - - Lexically compares \a s1 with \a s2 and returns an integer less - than, equal to, or greater than zero if \a s1 is less than, equal - to, or greater than \a s2. - - The comparison is based exclusively on the numeric Unicode values - of the characters and is very fast, but is not what a human would - expect. Consider sorting user-interface strings with - TQString::localeAwareCompare(). - - \code - int a = TQString::compare( "def", "abc" ); // a > 0 - int b = TQString::compare( "abc", "def" ); // b < 0 - int c = TQString::compare( "abc", "abc" ); // c == 0 - \endcode -*/ - -/*! - \overload - - Lexically compares this string with \a s and returns an integer - less than, equal to, or greater than zero if it is less than, equal - to, or greater than \a s. -*/ -int TQString::compare( const TQString& s ) const -{ - return ucstrcmp( *this, s ); -} - -/*! - \fn int TQString::localeAwareCompare( const TQString & s1, const TQString & s2 ) - - Compares \a s1 with \a s2 and returns an integer less than, equal - to, or greater than zero if \a s1 is less than, equal to, or - greater than \a s2. - - The comparison is performed in a locale- and also - platform-dependent manner. Use this function to present sorted - lists of strings to the user. - - \sa TQString::compare() TQTextCodec::locale() -*/ - -/*! - \overload - - Compares this string with \a s. -*/ - -#if !defined(CSTR_LESS_THAN) -#define CSTR_LESS_THAN 1 -#define CSTR_ETQUAL 2 -#define CSTR_GREATER_THAN 3 -#endif - -int TQString::localeAwareCompare( const TQString& s ) const -{ - // do the right thing for null and empty - if ( isEmpty() || s.isEmpty() ) - return compare( s ); - -#if defined(TQ_WS_WIN) - int res; - TQT_WA( { - const TCHAR* s1 = (TCHAR*)ucs2(); - const TCHAR* s2 = (TCHAR*)s.ucs2(); - res = CompareStringW( LOCALE_USER_DEFAULT, 0, s1, length(), s2, s.length() ); - } , { - TQCString s1 = local8Bit(); - TQCString s2 = s.local8Bit(); - res = CompareStringA( LOCALE_USER_DEFAULT, 0, s1.data(), s1.length(), s2.data(), s2.length() ); - } ); - - switch ( res ) { - case CSTR_LESS_THAN: - return -1; - case CSTR_GREATER_THAN: - return 1; - default: - return 0; - } -#elif defined(TQ_WS_MACX) - int delta = 0; -#if !defined(TQT_NO_TEXTCODEC) - TQTextCodec *codec = TQTextCodec::codecForLocale(); - if (codec) - delta = strcoll(codec->fromUnicode(*this), codec->fromUnicode(s)); - if (delta == 0) -#endif - delta = ucstrcmp(*this, s); - return delta; -#elif defined(TQ_WS_X11) - // declared in <string.h> - int delta = strcoll( local8Bit(), s.local8Bit() ); - if ( delta == 0 ) - delta = ucstrcmp( *this, s ); - return delta; -#else - return ucstrcmp( *this, s ); -#endif -} - -bool operator==( const TQString &s1, const TQString &s2 ) -{ - if ( s1.tqunicode() == s2.tqunicode() ) - return TRUE; - return (s1.length() == s2.length()) && s1.isNull() == s2.isNull() && - (memcmp((char*)s1.tqunicode(),(char*)s2.tqunicode(), - s1.length()*sizeof(TQChar)) == 0 ); -} - -bool operator!=( const TQString &s1, const TQString &s2 ) -{ return !(s1==s2); } - -bool operator<( const TQString &s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) < 0; } - -bool operator<=( const TQString &s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) <= 0; } - -bool operator>( const TQString &s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) > 0; } - -bool operator>=( const TQString &s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) >= 0; } - - -bool operator==( const TQString &s1, const char *s2 ) -{ - if ( !s2 ) - return s1.isNull(); - - int len = s1.length(); - const TQChar *uc = s1.tqunicode(); - while ( len ) { - if ( !(*s2) || uc->tqunicode() != (uchar) *s2 ) - return FALSE; - ++uc; - ++s2; - --len; - } - return !*s2; -} - -bool operator==( const char *s1, const TQString &s2 ) -{ return (s2 == s1); } - -bool operator!=( const TQString &s1, const char *s2 ) -{ return !(s1==s2); } - -bool operator!=( const char *s1, const TQString &s2 ) -{ return !(s1==s2); } - -bool operator<( const TQString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) < 0; } - -bool operator<( const char *s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) < 0; } - -bool operator<=( const TQString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) <= 0; } - -bool operator<=( const char *s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) <= 0; } - -bool operator>( const TQString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) > 0; } - -bool operator>( const char *s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) > 0; } - -bool operator>=( const TQString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) >= 0; } - -bool operator>=( const char *s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) >= 0; } - - -/***************************************************************************** - Documentation for TQString related functions - *****************************************************************************/ - -/*! - \fn bool operator==( const TQString &s1, const TQString &s2 ) - - \relates TQString - - Returns TRUE if \a s1 is equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) == 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator==( const TQString &s1, const char *s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) == 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator==( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) == 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator!=( const TQString &s1, const TQString &s2 ) - - \relates TQString - - Returns TRUE if \a s1 is not equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) != 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator!=( const TQString &s1, const char *s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is not equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) != 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator!=( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is not equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) != 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator<( const TQString &s1, const char *s2 ) - - \relates TQString - - Returns TRUE if \a s1 is lexically less than \a s2; otherwise returns FALSE. - The comparison is case sensitive. - - Equivalent to compare(\a s1, \a s2) \< 0. -*/ - -/*! - \fn bool operator<( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is lexically less than \a s2; otherwise returns FALSE. - The comparison is case sensitive. - - Equivalent to compare(\a s1, \a s2) \< 0. -*/ - -/*! - \fn bool operator<=( const TQString &s1, const char *s2 ) - - \relates TQString - - Returns TRUE if \a s1 is lexically less than or equal to \a s2; - otherwise returns FALSE. - The comparison is case sensitive. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1,\a s2) \<= 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator<=( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is lexically less than or equal to \a s2; - otherwise returns FALSE. - The comparison is case sensitive. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) \<= 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator>( const TQString &s1, const char *s2 ) - - \relates TQString - - Returns TRUE if \a s1 is lexically greater than \a s2; otherwise - returns FALSE. - The comparison is case sensitive. - - Equivalent to compare(\a s1, \a s2) \> 0. -*/ - -/*! - \fn bool operator>( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is lexically greater than \a s2; otherwise - returns FALSE. - The comparison is case sensitive. - - Equivalent to compare(\a s1, \a s2) \> 0. -*/ - -/*! - \fn bool operator>=( const TQString &s1, const char *s2 ) - - \relates TQString - - Returns TRUE if \a s1 is lexically greater than or equal to \a s2; - otherwise returns FALSE. - The comparison is case sensitive. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) \>= 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator>=( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is lexically greater than or equal to \a s2; - otherwise returns FALSE. - The comparison is case sensitive. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) \>= 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn const TQString operator+( const TQString &s1, const TQString &s2 ) - - \relates TQString - - Returns a string which is the result of concatenating the string - \a s1 and the string \a s2. - - Equivalent to \a {s1}.append(\a s2). -*/ - -/*! - \fn const TQString operator+( const TQString &s1, const char *s2 ) - - \overload - \relates TQString - - Returns a string which is the result of concatenating the string - \a s1 and character \a s2. - - Equivalent to \a {s1}.append(\a s2). -*/ - -/*! - \fn const TQString operator+( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns a string which is the result of concatenating the - character \a s1 and string \a s2. -*/ - -/*! - \fn const TQString operator+( const TQString &s, char c ) - - \overload - \relates TQString - - Returns a string which is the result of concatenating the string - \a s and character \a c. - - Equivalent to \a {s}.append(\a c). -*/ - -/*! - \fn const TQString operator+( char c, const TQString &s ) - - \overload - \relates TQString - - Returns a string which is the result of concatenating the - character \a c and string \a s. - - Equivalent to \a {s}.prepend(\a c). -*/ - - -/***************************************************************************** - TQString stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -/*! - \relates TQString - - Writes the string \a str to the stream \a s. - - See also \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator<<( TQDataStream &s, const TQString &str ) -{ - if ( s.version() == 1 ) { - TQCString l( str.latin1() ); - s << l; - } - else { - int byteOrder = s.byteOrder(); - const TQChar* ub = str.tqunicode(); - if ( ub || s.version() < 3 ) { - static const uint auto_size = 1024; - char t[auto_size]; - char *b; - if ( str.length()*sizeof(TQChar) > auto_size ) { - b = new char[str.length()*sizeof(TQChar)]; - } else { - b = t; - } - int l = str.length(); - char *c=b; - while ( l-- ) { - if ( byteOrder == TQDataStream::BigEndian ) { - *c++ = (char)ub->row(); - *c++ = (char)ub->cell(); - } else { - *c++ = (char)ub->cell(); - *c++ = (char)ub->row(); - } - ub++; - } - s.writeBytes( b, sizeof(TQChar)*str.length() ); - if ( str.length()*sizeof(TQChar) > auto_size ) - delete [] b; - } else { - // write null marker - s << (TQ_UINT32)0xffffffff; - } - } - return s; -} - -/*! - \relates TQString - - Reads a string from the stream \a s into string \a str. - - See also \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator>>( TQDataStream &s, TQString &str ) -{ -#ifdef TQT_TQSTRING_UCS_4 -#if defined(TQ_CC_GNU) -#warning "operator>> not working properly" -#endif -#endif - if ( s.version() == 1 ) { - TQCString l; - s >> l; - str = TQString( l ); - } - else { - TQ_UINT32 bytes = 0; - s >> bytes; // read size of string - if ( bytes == 0xffffffff ) { // null string - str = TQString::null; - } else if ( bytes > 0 ) { // not empty - int byteOrder = s.byteOrder(); - str.setLength( bytes/2 ); - TQChar* ch = str.d->tqunicode; - static const uint auto_size = 1024; - char t[auto_size]; - char *b; - if ( bytes > auto_size ) { - b = new char[bytes]; - } else { - b = t; - } - s.readRawBytes( b, bytes ); - int bt = bytes/2; - char *oldb = b; - while ( bt-- ) { - if ( byteOrder == TQDataStream::BigEndian ) - *ch++ = (ushort) (((ushort)b[0])<<8) | (uchar)b[1]; - else - *ch++ = (ushort) (((ushort)b[1])<<8) | (uchar)b[0]; - b += 2; - } - if ( bytes > auto_size ) - delete [] oldb; - } else { - str = ""; - } - } - return s; -} -#endif // TQT_NO_DATASTREAM - -/***************************************************************************** - TQConstString member functions - *****************************************************************************/ - -/*! - \class TQConstString tqstring.h - \reentrant - \ingroup text - \brief The TQConstString class provides string objects using constant Unicode data. - - In order to minimize copying, highly optimized applications can - use TQConstString to provide a TQString-compatible object from - existing Unicode data. It is then the programmer's responsibility - to ensure that the Unicode data exists for the entire lifetime of - the TQConstString object. - - A TQConstString is created with the TQConstString constructor. The - string held by the object can be obtained by calling string(). -*/ - -/*! - Constructs a TQConstString that uses the first \a length Unicode - characters in the array \a tqunicode. Any attempt to modify copies - of the string will cause it to create a copy of the data, thus it - remains forever unmodified. - - The data in \a tqunicode is not copied. The caller must be able to - guarantee that \a tqunicode will not be deleted or modified. -*/ -TQConstString::TQConstString( const TQChar* tqunicode, uint length ) : - TQString( new TQStringData( (TQChar*)tqunicode, length, length ), TRUE ) -{ -} - -/*! - Destroys the TQConstString, creating a copy of the data if other - strings are still using it. -*/ -TQConstString::~TQConstString() -{ - if ( d->count > 1 ) { - TQChar* cp = TQT_ALLOC_TQCHAR_VEC( d->len ); - memcpy( cp, d->tqunicode, d->len*sizeof(TQChar) ); - d->tqunicode = cp; - } else { - d->tqunicode = 0; - } - - // The original d->tqunicode is now unlinked. -} - -/*! - \fn const TQString& TQConstString::string() const - - Returns a constant string referencing the data passed during - construction. -*/ - -/*! - Returns TRUE if the string starts with \a s; otherwise returns - FALSE. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - \code - TQString str( "Bananas" ); - str.startsWith( "Ban" ); // returns TRUE - str.startsWith( "Car" ); // returns FALSE - \endcode - - \sa endsWith() -*/ -bool TQString::startsWith( const TQString& s, bool cs ) const -{ - if ( isNull() ) - return s.isNull(); - if ( s.length() > length() ) - return FALSE; - if ( cs ) { - return memcmp((char*)d->tqunicode, (char*)s.d->tqunicode, s.length()*sizeof(TQChar)) == 0; - } else { - for ( int i = 0; i < (int) s.length(); i++ ) { - if ( ::lower(d->tqunicode[i]) != ::lower(s.d->tqunicode[i]) ) - return FALSE; - } - } - return TRUE; -} - -bool TQString::startsWith( const TQString& s ) const -{ - return startsWith( s, TRUE ); -} - -/*! - Returns TRUE if the string ends with \a s; otherwise returns - FALSE. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - \code - TQString str( "Bananas" ); - str.endsWith( "anas" ); // returns TRUE - str.endsWith( "pple" ); // returns FALSE - \endcode - - \sa startsWith() -*/ -bool TQString::endsWith( const TQString& s, bool cs ) const -{ - if ( isNull() ) - return s.isNull(); - int pos = length() - s.length(); - if ( pos < 0 ) - return FALSE; - if ( cs ) { - return memcmp((char*)&d->tqunicode[pos], (char*)s.d->tqunicode, s.length()*sizeof(TQChar)) == 0; - } else { - for ( int i = 0; i < (int) s.length(); i++ ) { - if ( ::lower(d->tqunicode[pos + i]) != ::lower(s.d->tqunicode[i]) ) - return FALSE; - } - } - return TRUE; -} - -bool TQString::endsWith( const TQString& s ) const -{ - return endsWith( s, TRUE ); -} - -/*! \fn void TQString::detach() - If the string does not share its data with another TQString instance, - nothing happens; otherwise the function creates a new, unique copy of - this string. This function is called whenever the string is modified. The - implicit sharing mechanism is implemented this way. -*/ - -#if defined(TQ_OS_WIN32) - -#include <windows.h> - -/*! - \obsolete - - Returns a static Windows TCHAR* from a TQString, adding NUL if \a - addnul is TRUE. - - The lifetime of the return value is until the next call to this function, - or until the last copy of str is deleted, whatever comes first. - - Use ucs2() instead. -*/ -const void* qt_winTchar(const TQString& str, bool) -{ - // So that the return value lives long enough. - static TQString str_cache; - str_cache = str; -#ifdef UNICODE - return str_cache.ucs2(); -#else - return str_cache.latin1(); -#endif -} - -/*! - Makes a new '\0'-terminated Windows TCHAR* from a TQString. -*/ -void* qt_winTchar_new(const TQString& str) -{ - if ( str.isNull() ) - return 0; - int l = str.length()+1; - TCHAR *tc = new TCHAR[ l ]; -#ifdef UNICODE - memcpy( tc, str.ucs2(), sizeof(TCHAR)*l ); -#else - memcpy( tc, str.latin1(), sizeof(TCHAR)*l ); -#endif - return tc; -} - -/*! - Makes a TQString from a Windows TCHAR*. -*/ -TQString qt_winTQString(void* tc) -{ -#ifdef UNICODE - return TQString::fromUcs2( (ushort*)tc ); -#else - return TQString::tqfromLatin1( (TCHAR *)tc ); -#endif -} - -TQCString qt_winTQString2MB( const TQString& s, int uclen ) -{ - if ( uclen < 0 ) - uclen = s.length(); - if ( s.isNull() ) - return TQCString(); - if ( uclen == 0 ) - return TQCString(""); - BOOL used_def; - TQCString mb(4096); - int len; - while ( !(len=WideCharToMultiByte(CP_ACP, 0, (const WCHAR*)s.tqunicode(), uclen, - mb.data(), mb.size()-1, 0, &used_def)) ) - { - int r = GetLastError(); - if ( r == ERROR_INSUFFICIENT_BUFFER ) { - mb.resize(1+WideCharToMultiByte( CP_ACP, 0, - (const WCHAR*)s.tqunicode(), uclen, - 0, 0, 0, &used_def)); - // and try again... - } else { -#ifndef TQT_NO_DEBUG - // Fail. - qWarning("WideCharToMultiByte cannot convert multibyte text (error %d): %s (UTF8)", - r, s.utf8().data()); -#endif - break; - } - } - mb[len]='\0'; - return mb; -} - -// WATCH OUT: mblen must include the NUL (or just use -1) -TQString qt_winMB2TQString( const char* mb, int mblen ) -{ - if ( !mb || !mblen ) - return TQString::null; - const int wclen_auto = 4096; - WCHAR wc_auto[wclen_auto]; - int wclen = wclen_auto; - WCHAR *wc = wc_auto; - int len; - while ( !(len=MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, - mb, mblen, wc, wclen )) ) - { - int r = GetLastError(); - if ( r == ERROR_INSUFFICIENT_BUFFER ) { - if ( wc != wc_auto ) { - qWarning("Size changed in MultiByteToWideChar"); - break; - } else { - wclen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, - mb, mblen, 0, 0 ); - wc = new WCHAR[wclen]; - // and try again... - } - } else { - // Fail. - qWarning("MultiByteToWideChar cannot convert multibyte text"); - break; - } - } - if ( len <= 0 ) - return TQString::null; - TQString s( (TQChar*)wc, len - 1 ); // len - 1: we don't want terminator - if ( wc != wc_auto ) - delete [] wc; - return s; -} - -#endif // TQ_OS_WIN32 - -#endif // USE_QT4 diff --git a/tqtinterface/qt4/src/tools/tqstring.h b/tqtinterface/qt4/src/tools/tqstring.h deleted file mode 100644 index c82af1f..0000000 --- a/tqtinterface/qt4/src/tools/tqstring.h +++ /dev/null @@ -1,1687 +0,0 @@ -/**************************************************************************** -** -** Definition of the TQString class, and related Unicode functions. -** -** Created : 920609 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQSTRING_H -#define TQSTRING_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqcstring.h" -#endif // TQT_H - -#ifdef USE_QT4 - -#include <Qt/qstring.h> -#include <Qt/qmetatype.h> - -#endif // USE_QT4 - -#ifndef TQT_NO_CAST_ASCII -#include <limits.h> -#include <string> -#endif - -#ifndef TQT_NO_STL -#if defined ( TQ_CC_MSVC_NET ) && _MSC_VER < 1310 // Avoids nasty warning for xlocale, line 450 -# pragma warning ( push ) -# pragma warning ( disable : 4189 ) -# include <string> -# pragma warning ( pop ) -#else -# include <string> -#endif -#if defined(TQ_WRONG_SB_CTYPE_MACROS) && defined(_SB_CTYPE_MACROS) -#undef _SB_CTYPE_MACROS -#endif -#endif - -#ifdef USE_QT4 - -class TQCharRef; - -class TQ_EXPORT TQChar : public QChar -{ -public: - enum SpecialCharacter { - Null = Null, - Nbsp = Nbsp, - ReplacementCharacter = ReplacementCharacter, - ObjectReplacementCharacter = ObjectReplacementCharacter, - ByteOrderMark = ByteOrderMark, - ByteOrderSwapped = ByteOrderSwapped, - -// null = Null, -// replacement = ReplacementCharacter, -// byteOrderMark = ByteOrderMark, -// byteOrderSwapped = ByteOrderSwapped, -// nbsp = Nbsp, - - ParagraphSeparator = ParagraphSeparator, - LineSeparator = LineSeparator - }; - - TQT_STATIC_CONST TQChar null; - TQT_STATIC_CONST TQChar replacement; - TQT_STATIC_CONST TQChar byteOrderMark; - TQT_STATIC_CONST TQChar byteOrderSwapped; - TQT_STATIC_CONST TQChar nbsp; - - TQChar() : QChar() {} - TQChar( char c ) : QChar( c ) {} - TQChar( uchar c ) : QChar( c ) {} - TQChar( uchar c, uchar r ) : QChar( c, r ) {} - TQChar( const QChar& c ) : QChar( c ) {} - TQChar( ushort rc ) : QChar( rc ) {} - TQChar( short rc ) : QChar( rc ) {} - TQChar( uint rc ) : QChar( rc ) {} - TQChar( int rc ) : QChar( rc ) {} - TQChar(TQChar::SpecialCharacter sc) : QChar( (QChar::SpecialCharacter)sc ) {} - - inline TQChar lower() const { return toLower(); } - inline TQChar upper() const { return toUpper(); } - -#ifdef Q_COMPILER_MANGLES_RETURN_TYPE - inline const char latin1() const { return toLatin1(); } - inline const char ascii() const { return toAscii(); } -#else - inline char latin1() const { return toLatin1(); } - inline char ascii() const { return toAscii(); } -#endif - -#ifndef TQT_NO_CAST_ASCII - inline operator char() const { return latin1(); } -#endif - - static inline bool networkOrdered() { - return QSysInfo::ByteOrder == QSysInfo::BigEndian; - } - - inline TQChar &operator=( char ch ) { this->QChar::operator=(ch); return *this; } - - inline ushort tqunicode() const { return unicode(); } - inline bool mirrored() const { return hasMirrored(); } - - using QChar::operator=; -}; - -Q_DECLARE_METATYPE(TQChar) - -inline bool operator==( char ch, QChar c ) { return (TQChar(ch) == c); } -inline bool operator==( QChar c, char ch ) { return (TQChar(ch) == c); } -inline bool operator!=( char ch, QChar c ) { return (TQChar(ch) != c); } -inline bool operator!=( QChar c, char ch ) { return (TQChar(ch) != c); } - -inline bool operator==( int ch, QChar c ) { return (TQChar(ch) == c); } -inline bool operator==( QChar c, int ch ) { return (TQChar(ch) == c); } -inline bool operator!=( int ch, QChar c ) { return (TQChar(ch) == c); } -inline bool operator!=( QChar c, int ch ) { return (TQChar(ch) == c); } - -class TQ_EXPORT TQString : public QString -{ -public: - TQString() : QString() {} - TQString( QChar tc ) : QString( tc ) {} - TQString( const QString &ts ) : QString( ts ) {} - TQString( const QByteArray &ba ) : QString( ba ) { int slen = int(strlen(ba)); if (length() > slen) truncate(slen); } - TQString( const QChar* tqunicode, uint length ) : QString( tqunicode, length ) {} -#ifndef TQT_NO_CAST_ASCII - TQString( const char *str ) : QString( str ) {} -#endif -#ifndef TQT_NO_STL - TQString( const std::string &str ) : QString(str.c_str()) {} -#endif - - int find( QChar c, int index=0, bool cs=TRUE ) const { return indexOf(c, index, (Qt::CaseSensitivity)cs); } - int find( char c, int index=0, bool cs=TRUE ) const { return indexOf(c, index, (Qt::CaseSensitivity)cs); } - int find( const QString &str, int index=0, bool cs=TRUE ) const { return indexOf(str, index, (Qt::CaseSensitivity)cs); } -#ifndef TQT_NO_REGEXP - int find( const QRegExp &qr, int index=0 ) const { return indexOf(qr, index); } -#endif -#ifndef TQT_NO_CAST_ASCII - int find( const char* str, int index=0 ) const { return indexOf(str, index); } -#endif - int findRev( QChar c, int index=-1, bool cs=TRUE) const { return lastIndexOf(c, index, (Qt::CaseSensitivity)cs); } - int findRev( char c, int index=-1, bool cs=TRUE) const { return lastIndexOf(c, index, (Qt::CaseSensitivity)cs); } - int findRev( const QString &str, int index=-1, bool cs=TRUE) const { return lastIndexOf(str, index, (Qt::CaseSensitivity)cs); } -#ifndef TQT_NO_REGEXP - int findRev( const QRegExp &qr, int index=-1 ) const { return lastIndexOf(qr, index); } -#endif -#ifndef TQT_NO_CAST_ASCII - int findRev( const char* str, int index=-1 ) const { return lastIndexOf(str, index); } -#endif - - const char* latin1() const { return latin1_helper(); } - const char* ascii() const { return ascii_helper(); } - - bool simpleText() const; - void checkSimpleText() const; - - TQString copy() const; - - inline TQString lower() const { return toLower(); } - inline TQString upper() const { return toUpper(); } - inline TQString stripWhiteSpace() const { return trimmed(); } - inline TQString simplifyWhiteSpace() const { return simplified(); } - - inline TQString fill( TQChar c, int len = -1 ) { return QString::fill(c, len); } - - // QString::Null compatibility - struct Null { }; - static const Null null; - inline TQString(const Null &) : QString() {} - inline TQString &operator=(const Null &) { *this = TQString(); return *this; } - - int contains( QChar c, bool cs=TRUE ) const { return count(c, (Qt::CaseSensitivity)cs); } - int contains( char c, bool cs=TRUE ) const { return contains(TQChar(c), cs); } -#ifndef TQT_NO_CAST_ASCII - int contains( const char* str, bool cs=TRUE ) const { return count(str, (Qt::CaseSensitivity)cs); } -#endif - int contains( const QString &str, bool cs=TRUE ) const { return count(str, (Qt::CaseSensitivity)cs); } -#ifndef TQT_NO_REGEXP - int contains( const QRegExp &re ) const { return count(re); } -#endif - -#ifndef QT_NO_CAST_TO_ASCII - inline operator const char *() const { return ascii_helper(); } -#endif - - inline bool tqstartsWith( const TQString& str ) const { return QString::startsWith(str); } - inline bool tqstartsWith( const TQString& str, bool cs ) const { return QString::startsWith(str, (cs)?Qt::CaseSensitive:Qt::CaseInsensitive); } - inline bool tqendsWith( const TQString& str ) const { return QString::endsWith(str); } - inline bool tqendsWith( const TQString& str, bool cs ) const { return QString::endsWith(str, (cs)?Qt::CaseSensitive:Qt::CaseInsensitive); } - - TQCString utf8() const; - inline TQChar constref(uint i) const { return tqat(i); } - inline TQString leftJustify(int width, QChar aFill = QLatin1Char(' '), bool trunc=false) const { return QString::leftJustified(width, aFill, trunc); } - inline TQString rightJustify(int width, QChar aFill = QLatin1Char(' '), bool trunc=false) const { return QString::rightJustified(width, aFill, trunc); } - - inline const TQChar* tqunicode() const { if (length() > 0) return static_cast<const TQChar*>(unicode()); else return static_cast<const TQChar*>(QString().unicode()); } - TQCString local8Bit() const; - - inline TQString replace(int i, int len, QChar after) { return QString::replace( i, len, &after, 1 ); } - inline TQString replace(int i, int len, const QChar *s, int slen) { - // Mimic the old (undocumented) behavior - int newindex = i; - if (newindex > length()) newindex = length(); - return QString::replace( newindex, len, s, slen ); - } - inline TQString replace(int i, int len, const QString &after) { return QString::replace( i, len, TQString(after).tqunicode(), after.length() ); } - inline TQString replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive) { return QString::replace( before, after, cs ); } - inline TQString replace(const QChar *before, int blen, const QChar *after, int alen, Qt::CaseSensitivity cs = Qt::CaseSensitive) { return QString::replace( before, blen, after, alen, cs ); } - inline TQString replace(const QLatin1String &before, const QLatin1String &after, Qt::CaseSensitivity cs = Qt::CaseSensitive) { return QString::replace( before, after, cs ); } - inline TQString replace(const QLatin1String &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive) { return QString::replace( before, after, cs ); } - inline TQString replace(const QString &before, const QLatin1String &after, Qt::CaseSensitivity cs = Qt::CaseSensitive) { return QString::replace( before, after, cs ); } - inline TQString replace(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive) { return QString::replace( before, after, cs ); } - inline TQString replace(QChar c, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive) { return QString::replace( c, after, cs ); } - inline TQString replace(QChar c, const QLatin1String &after, Qt::CaseSensitivity cs = Qt::CaseSensitive) { return QString::replace( c, after, cs ); } -#ifndef QT_NO_REGEXP - inline TQString replace(const QRegExp &rx, const QString &after) { return QString::replace( rx, after ); } -#endif - inline TQString replace(const QString &before, const QString &after, bool cs) { return QString::replace(before, after, cs?Qt::CaseSensitive:Qt::CaseInsensitive); } - - inline TQString tqsetNum( short a, int base=10 ) { return setNum(a, base); } - inline TQString tqsetNum( ushort a, int base=10 ) { return setNum(a, base); } - inline TQString tqsetNum( int a, int base=10 ) { return setNum(a, base); } - inline TQString tqsetNum( uint a, int base=10 ) { return setNum(a, base); } - inline TQString tqsetNum( long a, int base=10 ) { return setNum(a, base); } - inline TQString tqsetNum( ulong a, int base=10 ) { return setNum(a, base); } - inline TQString tqsetNum( TQ_LLONG a, int base=10 ) { return setNum(a, base); } - inline TQString tqsetNum( TQ_ULLONG a, int base=10 ) { return setNum(a, base); } - inline TQString tqsetNum( float a, char f='g', int prec=6 ) { return setNum(a, f, prec); } - inline TQString tqsetNum( double a, char f='g', int prec=6 ) { return setNum(a, f, prec); } - - inline TQString remove( uint index, uint len ) { if (index<=((uint)length())) return QString::remove(index, len); return *this; } - inline TQString remove( const QString &qs ) { return QString::remove(qs); } - inline TQString remove( const QString &qs, bool cs ) { return QString::remove(qs, cs?Qt::CaseSensitive:Qt::CaseInsensitive); } - inline TQString remove( QChar c ) { return QString::remove(c); } - inline TQString remove( char c ) { return remove( QChar(c) ); } -#ifndef TQT_NO_CAST_ASCII - inline TQString remove( const char *ch ) { return QString::remove(ch); } -#endif -#ifndef TQT_NO_REGEXP - inline TQString remove( const QRegExp &re ) { return QString::remove(re); } -#endif - - inline TQString section( TQChar sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const { return QString::section(sep, start, end, (QString::SectionFlags)flags); } - inline TQString section( char sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const { return QString::section(sep, start, end, (QString::SectionFlags)flags); } -#ifndef TQT_NO_CAST_ASCII - inline TQString section( const char *in_sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const { return QString::section(in_sep, start, end, (QString::SectionFlags)flags); } -#endif - inline TQString section( const QString in_sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const { return QString::section(in_sep, start, end, (QString::SectionFlags)flags); } -#ifndef TQT_NO_REGEXP - inline TQString section( const QRegExp reg, int start, int end = 0xffffffff, int flags = SectionDefault ) const { return QString::section(reg, start, end, (QString::SectionFlags)flags); } -#endif - - inline static TQString fromUcs2(const ushort *unicode, int size = -1) { return fromUtf16(unicode, size); } - inline const unsigned short *ucs2() const { return utf16(); } - - inline TQString left( uint len ) const { return TQString(QString::left(len)); } - inline TQString right( uint len ) const { return TQString(QString::right(len)); } - inline TQString mid( uint index, uint len=0xffffffff) const { return TQString(QString::mid(index, len)); } - - inline static TQString number( long n, int base=10 ) { return TQString(QString::number(n, base)); } - inline static TQString number( ulong n, int base=10) { return TQString(QString::number(n, base)); } - inline static TQString number( TQ_LLONG n, int base=10 ) { return TQString(QString::number(n, base)); } - inline static TQString number( TQ_ULLONG n, int base=10) { return TQString(QString::number(n, base)); } - inline static TQString number( int n, int base=10 ) { return TQString(QString::number(n, base)); } - inline static TQString number( uint n, int base=10) { return TQString(QString::number(n, base)); } - inline static TQString number( double n, char f='g', int prec=6 ) { return TQString(QString::number(n, f, prec)); } - - float toFloat( bool *ok=0 ) const; - double toDouble( bool *ok=0 ) const; - - TQString &setAscii( const char*, int len=-1 ); - TQString &setLatin1( const char *ch, int len=-1 ); - -// inline TQString tqarg( long a, int fieldWidth = 0, int base = 10 ) const { return TQString(this->arg(a, fieldWidth, base)); } -// inline TQString tqarg( ulong a, int fieldWidth = 0, int base = 10 ) const { return TQString(this->arg(a, fieldWidth, base)); } -// inline TQString tqarg( TQ_LLONG a, int fieldwidth=0, int base=10 ) const { return TQString(this->arg(a, fieldwidth, base)); } -// inline TQString tqarg( TQ_ULLONG a, int fieldwidth=0, int base=10 ) const { return TQString(this->arg(a, fieldwidth, base)); } -// inline TQString tqarg( int a, int fieldWidth = 0, int base = 10 ) const { return TQString(this->arg(a, fieldWidth, base)); } -// inline TQString tqarg( uint a, int fieldWidth = 0, int base = 10 ) const { return TQString(this->arg(a, fieldWidth, base)); } -// inline TQString tqarg( short a, int fieldWidth = 0, int base = 10 ) const { return TQString(this->arg(a, fieldWidth, base)); } -// inline TQString tqarg( ushort a, int fieldWidth = 0, int base = 10 ) const { return TQString(this->arg(a, fieldWidth, base)); } -// inline TQString tqarg( double a, int fieldWidth = 0, char fmt = 'g', int prec = -1 ) const { return TQString(this->arg(a, fieldWidth, fmt, prec)); } -// inline TQString tqarg( char a, int fieldWidth = 0 ) const { return TQString(this->arg(a, fieldWidth)); } -// inline TQString tqarg( TQChar a, int fieldWidth = 0 ) const { return TQString(this->arg(a, fieldWidth)); } -// inline TQString tqarg( const TQString& a, int fieldWidth = 0 ) const { return TQString(this->arg(a, fieldWidth)); } -// inline TQString tqarg( const TQString& a1, const TQString& a2 ) const { return TQString(this->arg(a1, a2)); } -// inline TQString tqarg( const TQString& a1, const TQString& a2, const TQString& a3 ) const { return TQString(this->arg(a1, a2, a3)); } -// inline TQString tqarg( const TQString& a1, const TQString& a2, const TQString& a3, const TQString& a4 ) const { return TQString(this->arg(a1, a2, a3, a4)); } - - TQString tqarg( long a, int fieldWidth = 0, int base = 10 ) const; - TQString tqarg( ulong a, int fieldWidth = 0, int base = 10 ) const; - TQString tqarg( TQ_LLONG a, int fieldwidth=0, int base=10 ) const; - TQString tqarg( TQ_ULLONG a, int fieldwidth=0, int base=10 ) const; - TQString tqarg( int a, int fieldWidth = 0, int base = 10 ) const; - TQString tqarg( uint a, int fieldWidth = 0, int base = 10 ) const; - TQString tqarg( short a, int fieldWidth = 0, int base = 10 ) const; - TQString tqarg( ushort a, int fieldWidth = 0, int base = 10 ) const; - TQString tqarg( double a, int fieldWidth = 0, char fmt = 'g', int prec = -1 ) const; - TQString tqarg( char a, int fieldWidth = 0 ) const; - TQString tqarg( TQChar a, int fieldWidth = 0 ) const; - TQString tqarg( const TQString& a, int fieldWidth = 0 ) const; - TQString tqarg( const TQString& a1, const TQString& a2 ) const; - TQString tqarg( const TQString& a1, const TQString& a2, const TQString& a3 ) const; - TQString tqarg( const TQString& a1, const TQString& a2, const TQString& a3, const TQString& a4 ) const; - - TQString setUnicodeCodes( const ushort* tqunicode_as_ushorts, uint len ); - - inline void setLength(int nl) { resize(nl); } - TQCharRef tqat( uint i ); - TQCharRef operator[]( int i ); - - static TQString fromLatin1(const char *ch, int len=-1); - static inline TQString tqfromLatin1(const char *ch, int len=-1) { return fromLatin1(ch, len); } - - static TQString fromUtf8(const char*, int len=-1); - - // FIXME - inline void compose() { /*printf("[FIXME] void TQString::compose() unimplemented\n\r");*/ } - - TQChar tqat( uint i ) const { return i < (uint)length() ? unicode()[i] : TQChar::null; } - TQChar operator[]( int i ) const { if ((i<0) || (i>=length())) return TQChar::null; else return tqat((uint)i); } - -// TQChar constref(uint i) const { return tqat(i); } - QChar& ref(uint i); - -// inline QChar ref(uint i) { return (*this)[i]; } - - TQString &operator+=( const TQString &str ); -#ifndef TQT_NO_CAST_ASCII - TQString &operator+=( const TQByteArray &str ); - TQString &operator+=( const char *str ); -#endif -#ifndef TQT_NO_CAST_ASCII - TQString &operator+=( const std::string& ); -#endif - TQString &operator+=( TQChar c ); - TQString &operator+=( char c ); - - TQString &operator+=( const QStringRef &s); - TQString &operator+=( const QLatin1String &s); - TQString &operator+=( QChar c ); - - using QString::operator=; - - friend class TQObject; - friend class TQWidget; - friend class TQStyle; - -protected: - const char *ascii_helper() const; - const char *latin1_helper() const; - -public: - static char* tqunicodeToLatin1( const TQChar*, uint len ); - -private: - mutable QByteArray tqstring_ascii_ba; - mutable QByteArray tqstring_latin1_ba; - mutable bool tqstring_issimpletext; - -private: -#ifndef TQT_NO_CAST_ASCII -// TQString &insertHelper( uint index, const char *s, uint len=UINT_MAX ); - TQString &operatorPlusEqHelper( const char *s, uint len2=UINT_MAX ); -#endif - -private: - void subat( uint ); - TQString tqmultiArg( int numArgs, const TQString& a1, const TQString& a2, const TQString& a3 = TQString(), const TQString& a4 = TQString() ) const; - -public: - // Interoperability - static const TQString& convertFromQString( QString& qstr ); -}; - -Q_DECLARE_METATYPE(TQString) - -// Interoperability -inline static const TQString& convertFromQString( const QString& qstr ) { - return (*static_cast<const TQString*>(&qstr)); -} - -inline TQString TQString::tqarg( int a, int fieldWidth, int base ) const { return tqarg( (TQ_LLONG)a, fieldWidth, base ); } -inline TQString TQString::tqarg( uint a, int fieldWidth, int base ) const { return tqarg( (TQ_ULLONG)a, fieldWidth, base ); } -inline TQString TQString::tqarg( short a, int fieldWidth, int base ) const { return tqarg( (TQ_LLONG)a, fieldWidth, base ); } -inline TQString TQString::tqarg( ushort a, int fieldWidth, int base ) const { return tqarg( (TQ_ULLONG)a, fieldWidth, base ); } -inline TQString TQString::tqarg( const TQString& a1, const TQString& a2 ) const { return tqmultiArg( 2, a1, a2 ); } -inline TQString TQString::tqarg( const TQString& a1, const TQString& a2, const TQString& a3 ) const { return tqmultiArg( 3, a1, a2, a3 ); } -inline TQString TQString::tqarg( const TQString& a1, const TQString& a2, const TQString& a3, const TQString& a4 ) const { return tqmultiArg( 4, a1, a2, a3, a4 ); } - -inline TQString TQString::copy() const { return TQString( *this ); } - -inline bool operator==(TQString::Null, TQString::Null) { return true; } -inline bool operator==(TQString::Null, const TQString &s) { return s.isNull(); } -inline bool operator==(const TQString &s, TQString::Null) { return s.isNull(); } -inline bool operator!=(TQString::Null, TQString::Null) { return false; } -inline bool operator!=(TQString::Null, const TQString &s) { return !s.isNull(); } -inline bool operator!=(const TQString &s, TQString::Null) { return !s.isNull(); } - -#ifndef TQT_NO_CAST_ASCII -inline TQString &TQString::operator+=( const TQByteArray &s ) -{ - int pos = s.find( 0 ); - return operatorPlusEqHelper( s, pos==-1 ? s.size() : pos ); -} -#endif - -#ifndef TQT_NO_CAST_ASCII -inline TQString &TQString::operator+=( const std::string& s ) -{ return operator+=(s.c_str()); } -#endif - -// [FIXME] The following operator+ functions spew a ridiculous number of (harmless) warnings -// due to the very similar QString operator+ functions. Can this be fixed??? - -TQ_EXPORT inline const TQString operator+( const TQString &s1, const TQString &s2 ) -{ - TQString tmp( s1 ); - tmp += s2; - return tmp; -} - -#ifndef TQT_NO_CAST_ASCII -TQ_EXPORT inline const TQString operator+( const TQString &s1, const char *s2 ) -{ - TQString tmp( s1 ); - tmp += TQString::fromAscii(s2); - return tmp; -} - -TQ_EXPORT inline const TQString operator+( const char *s1, const TQString &s2 ) -{ - TQString tmp = TQString::fromAscii( s1 ); - tmp += s2; - return tmp; -} -#endif - -TQ_EXPORT inline const TQString operator+( const TQString &s1, TQChar c2 ) -{ - TQString tmp( s1 ); - tmp += c2; - return tmp; -} - -TQ_EXPORT inline const TQString operator+( const TQString &s1, char c2 ) -{ - TQString tmp( s1 ); - tmp += c2; - return tmp; -} - -TQ_EXPORT inline const TQString operator+( TQChar c1, const TQString &s2 ) -{ - TQString tmp; - tmp += c1; - tmp += s2; - return tmp; -} - -TQ_EXPORT inline const TQString operator+( char c1, const TQString &s2 ) -{ - TQString tmp; - tmp += c1; - tmp += s2; - return tmp; -} - -#ifndef TQT_NO_STL -TQ_EXPORT inline const TQString operator+(const TQString& s1, const std::string& s2) -{ - return s1 + TQString(s2); -} - -TQ_EXPORT inline const TQString operator+(const std::string& s1, const TQString& s2) -{ - TQString tmp(s2); - return TQString(tmp.prepend(s1.c_str())); -} -#endif - -class TQConstString : public TQString -{ -public: - inline TQConstString(const QChar *aUnicode, int aSize) : TQString(aUnicode, aSize) {} // cannot use fromRawData() due to changed semantics - inline const TQString &string() const { return *this; } -}; - -class TQ_EXPORT TQCharRef { - friend class TQString; - TQString& s; - uint p; - TQCharRef(TQString* str, uint pos) : s(*str), p(pos) { } - -public: - // most TQChar operations repeated here - - // all this is not documented: We just say "like TQChar" and let it be. -#ifndef TQ_TQDOC - ushort unicode() const { return s.constref(p).tqunicode(); } - ushort tqunicode() const { return s.constref(p).tqunicode(); } - char latin1() const { return s.constref(p).latin1(); } - - // An operator= for each TQChar cast constructors - TQCharRef operator=(char c ) { s.ref(p)=c; return *this; } - TQCharRef operator=(uchar c ) { s.ref(p)=c; return *this; } - TQCharRef operator=(TQChar c ) { s.ref(p)=c; return *this; } - TQCharRef operator=(const TQCharRef& c ) { s.ref(p)=c.tqunicode(); return *this; } - TQCharRef operator=(ushort rc ) { s.ref(p)=rc; return *this; } - TQCharRef operator=(short rc ) { s.ref(p)=rc; return *this; } - TQCharRef operator=(uint rc ) { s.ref(p)=rc; return *this; } - TQCharRef operator=(int rc ) { s.ref(p)=rc; return *this; } - - operator TQChar () const { return s.constref(p); } - - // each function... - bool isNull() const { return tqunicode()==0; } - bool isPrint() const { return s.constref(p).isPrint(); } - bool isPunct() const { return s.constref(p).isPunct(); } - bool isSpace() const { return s.constref(p).isSpace(); } - bool isMark() const { return s.constref(p).isMark(); } - bool isLetter() const { return s.constref(p).isLetter(); } - bool isNumber() const { return s.constref(p).isNumber(); } - bool isLetterOrNumber() { return s.constref(p).isLetterOrNumber(); } - bool isDigit() const { return s.constref(p).isDigit(); } - - int digitValue() const { return s.constref(p).digitValue(); } - TQChar lower() const { return s.constref(p).lower(); } - TQChar upper() const { return s.constref(p).upper(); } - - TQChar::Category category() const { return s.constref(p).category(); } - TQChar::Direction direction() const { return s.constref(p).direction(); } - TQChar::Joining joining() const { return s.constref(p).joining(); } - bool mirrored() const { return s.constref(p).mirrored(); } - TQChar mirroredChar() const { return s.constref(p).mirroredChar(); } -// const TQString &decomposition() const { return s.constref(p).decomposition(); } - TQChar::Decomposition decompositionTag() const { return s.constref(p).decompositionTag(); } - unsigned char combiningClass() const { return s.constref(p).combiningClass(); } - - // Not the non-const ones of these. - uchar cell() const { return s.constref(p).cell(); } - uchar row() const { return s.constref(p).row(); } -#endif -}; - -// inline TQChar& TQString::ref(uint i) -inline QChar& TQString::ref(uint i) -{ // Optimized for easy-inlining by simple compilers. - if ( count() != 1 || i >= (uint)length() ) - subat( i ); -// d->setDirty(); -// return tqunicode()[i]; - -// const QCharRef& ref = QString::operator[](i); -// return *const_cast<TQChar*>(static_cast<const TQChar*>(&reinterpret_cast<const QChar&>(ref))); // [FIXME] Will this work the same as data->unicode did in Qt3? Will it work at all??? - - QChar *tdata = data(); - return tdata[i]; // [FIXME] Will this work the same as data->unicode did in Qt3? Will it work at all??? -} - -inline TQCharRef TQString::tqat( uint i ) { return TQCharRef(this,i); } -inline TQCharRef TQString::operator[]( int i ) { return tqat((uint)i); } - -/***************************************************************************** - TQString stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQString & ); -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQString & ); -#endif - -/***************************************************************************** - TQString non-member operators - *****************************************************************************/ - -inline TQ_EXPORT bool operator!=( const TQString &s1, const TQString &s2 ) { - if (s1.isNull() != s2.isNull()) return true; - return (static_cast<const QString&>(s1) != static_cast<const QString&>(s2)); -} -inline TQ_EXPORT bool operator==( const TQString &s1, const TQString &s2 ) { - if (s1.isNull() != s2.isNull()) return false; - return (static_cast<const QString&>(s1) == static_cast<const QString&>(s2)); -} - -#else // USE_QT4 - -/***************************************************************************** - TQString class - *****************************************************************************/ - -class TQRegExp; -class TQString; -class TQCharRef; -template <class T> class TQDeepCopy; - -class TQ_EXPORT TQChar { -public: - TQChar(); - TQChar( char c ); - TQChar( uchar c ); - TQChar( uchar c, uchar r ); - TQChar( const TQChar& c ); // ### remove in 4.0 to allow compiler optimization - TQChar( ushort rc ); - TQChar( short rc ); - TQChar( uint rc ); - TQChar( int rc ); - - TQT_STATIC_CONST TQChar null; // 0000 - TQT_STATIC_CONST TQChar replacement; // FFFD - TQT_STATIC_CONST TQChar byteOrderMark; // FEFF - TQT_STATIC_CONST TQChar byteOrderSwapped; // FFFE - TQT_STATIC_CONST TQChar nbsp; // 00A0 - - // Unicode information - - enum Category - { - NoCategory, - - Mark_NonSpacing, // Mn - Mark_SpacingCombining, // Mc - Mark_Enclosing, // Me - - Number_DecimalDigit, // Nd - Number_Letter, // Nl - Number_Other, // No - - Separator_Space, // Zs - Separator_Line, // Zl - Separator_Paragraph, // Zp - - Other_Control, // Cc - Other_Format, // Cf - Other_Surrogate, // Cs - Other_PrivateUse, // Co - Other_NotAssigned, // Cn - - Letter_Uppercase, // Lu - Letter_Lowercase, // Ll - Letter_Titlecase, // Lt - Letter_Modifier, // Lm - Letter_Other, // Lo - - Punctuation_Connector, // Pc - Punctuation_Dash, // Pd - Punctuation_Dask = Punctuation_Dash, // oops - Punctuation_Open, // Ps - Punctuation_Close, // Pe - Punctuation_InitialQuote, // Pi - Punctuation_FinalQuote, // Pf - Punctuation_Other, // Po - - Symbol_Math, // Sm - Symbol_Currency, // Sc - Symbol_Modifier, // Sk - Symbol_Other // So - }; - - enum Direction - { - DirL, DirR, DirEN, DirES, DirET, DirAN, DirCS, DirB, DirS, DirWS, DirON, - DirLRE, DirLRO, DirAL, DirRLE, DirRLO, DirPDF, DirNSM, DirBN - }; - - enum Decomposition - { - Single, Canonical, Font, NoBreak, Initial, Medial, - Final, Isolated, Circle, Super, Sub, Vertical, - Wide, Narrow, Small, Square, Compat, Fraction - }; - - enum Joining - { - OtherJoining, Dual, Right, Center - }; - - enum CombiningClass - { - Combining_BelowLeftAttached = 200, - Combining_BelowAttached = 202, - Combining_BelowRightAttached = 204, - Combining_LeftAttached = 208, - Combining_RightAttached = 210, - Combining_AboveLeftAttached = 212, - Combining_AboveAttached = 214, - Combining_AboveRightAttached = 216, - - Combining_BelowLeft = 218, - Combining_Below = 220, - Combining_BelowRight = 222, - Combining_Left = 224, - Combining_Right = 226, - Combining_AboveLeft = 228, - Combining_Above = 230, - Combining_AboveRight = 232, - - Combining_DoubleBelow = 233, - Combining_DoubleAbove = 234, - Combining_IotaSubscript = 240 - }; - - // ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO TQCharRef TOO - - int digitValue() const; - TQChar lower() const; - TQChar upper() const; - - Category category() const; - Direction direction() const; - Joining joining() const; - bool mirrored() const; - TQChar mirroredChar() const; - const TQString &decomposition() const; // ### return just TQString in 4.0 - Decomposition decompositionTag() const; - unsigned char combiningClass() const; - - char latin1() const { return ucs > 0xff ? 0 : (char) ucs; } - ushort tqunicode() const { return ucs; } -#ifdef TQ_NO_PACKED_REFERENCE - ushort &tqunicode() { return *((ushort*)&ucs); } -#else - ushort &tqunicode() { return ucs; } -#endif -#ifndef TQT_NO_CAST_ASCII - // like all ifdef'd code this is undocumented - operator char() const { return latin1(); } -#endif - - bool isNull() const { return tqunicode()==0; } - bool isPrint() const; - bool isPunct() const; - bool isSpace() const; - bool isMark() const; - bool isLetter() const; - bool isNumber() const; - bool isLetterOrNumber() const; - bool isDigit() const; - bool isSymbol() const; - - uchar cell() const { return ((uchar) ucs & 0xff); } - uchar row() const { return ((uchar) (ucs>>8)&0xff); } - void setCell( uchar cell ) { ucs = (ucs & 0xff00) + cell; } - void setRow( uchar row ) { ucs = (((ushort) row)<<8) + (ucs&0xff); } - - static bool networkOrdered() { - int wordSize; - bool bigEndian = FALSE; - qSysInfo( &wordSize, &bigEndian ); - return bigEndian; - } - - friend inline bool operator==( char ch, TQChar c ); - friend inline bool operator==( TQChar c, char ch ); - friend inline bool operator==( TQChar c1, TQChar c2 ); - friend inline bool operator!=( TQChar c1, TQChar c2 ); - friend inline bool operator!=( char ch, TQChar c ); - friend inline bool operator!=( TQChar c, char ch ); - friend inline bool operator<=( TQChar c, char ch ); - friend inline bool operator<=( char ch, TQChar c ); - friend inline bool operator<=( TQChar c1, TQChar c2 ); - -private: - ushort ucs; -#if defined(TQT_TQSTRING_UCS_4) - ushort grp; -#endif -} TQ_PACKED; - -inline TQChar::TQChar() : ucs( 0 ) -#ifdef TQT_TQSTRING_UCS_4 - , grp( 0 ) -#endif -{ -} -inline TQChar::TQChar( char c ) : ucs( (uchar)c ) -#ifdef TQT_TQSTRING_UCS_4 - , grp( 0 ) -#endif -{ -} -inline TQChar::TQChar( uchar c ) : ucs( c ) -#ifdef TQT_TQSTRING_UCS_4 - , grp( 0 ) -#endif -{ -} -inline TQChar::TQChar( uchar c, uchar r ) : ucs( (r << 8) | c ) -#ifdef TQT_TQSTRING_UCS_4 - , grp( 0 ) -#endif -{ -} -inline TQChar::TQChar( const TQChar& c ) : ucs( c.ucs ) -#ifdef TQT_TQSTRING_UCS_4 - , grp( c.grp ) -#endif -{ -} - -inline TQChar::TQChar( ushort rc ) : ucs( rc ) -#ifdef TQT_TQSTRING_UCS_4 - , grp( 0 ) -#endif -{ -} -inline TQChar::TQChar( short rc ) : ucs( (ushort) rc ) -#ifdef TQT_TQSTRING_UCS_4 - , grp( 0 ) -#endif -{ -} -inline TQChar::TQChar( uint rc ) : ucs( (ushort ) (rc & 0xffff) ) -#ifdef TQT_TQSTRING_UCS_4 - , grp( (ushort) ((rc >> 16) & 0xffff) ) -#endif -{ -} -inline TQChar::TQChar( int rc ) : ucs( (ushort) (rc & 0xffff) ) -#ifdef TQT_TQSTRING_UCS_4 - , grp( (ushort) ((rc >> 16) & 0xffff) ) -#endif -{ -} - -inline bool operator==( char ch, TQChar c ) -{ - return ((uchar) ch) == c.ucs; -} - -inline bool operator==( TQChar c, char ch ) -{ - return ((uchar) ch) == c.ucs; -} - -inline bool operator==( TQChar c1, TQChar c2 ) -{ - return c1.ucs == c2.ucs; -} - -inline bool operator!=( TQChar c1, TQChar c2 ) -{ - return c1.ucs != c2.ucs; -} - -inline bool operator!=( char ch, TQChar c ) -{ - return ((uchar)ch) != c.ucs; -} - -inline bool operator!=( TQChar c, char ch ) -{ - return ((uchar) ch) != c.ucs; -} - -inline bool operator<=( TQChar c, char ch ) -{ - return c.ucs <= ((uchar) ch); -} - -inline bool operator<=( char ch, TQChar c ) -{ - return ((uchar) ch) <= c.ucs; -} - -inline bool operator<=( TQChar c1, TQChar c2 ) -{ - return c1.ucs <= c2.ucs; -} - -inline bool operator>=( TQChar c, char ch ) { return ch <= c; } -inline bool operator>=( char ch, TQChar c ) { return c <= ch; } -inline bool operator>=( TQChar c1, TQChar c2 ) { return c2 <= c1; } -inline bool operator<( TQChar c, char ch ) { return !(ch<=c); } -inline bool operator<( char ch, TQChar c ) { return !(c<=ch); } -inline bool operator<( TQChar c1, TQChar c2 ) { return !(c2<=c1); } -inline bool operator>( TQChar c, char ch ) { return !(ch>=c); } -inline bool operator>( char ch, TQChar c ) { return !(c>=ch); } -inline bool operator>( TQChar c1, TQChar c2 ) { return !(c2>=c1); } - -// internal -struct TQ_EXPORT TQStringData : public TQShared { - TQStringData() : - TQShared(), tqunicode(0), ascii(0), len(0), issimpletext(TRUE), maxl(0), islatin1(FALSE) { ref(); } - TQStringData(TQChar *u, uint l, uint m) : - TQShared(), tqunicode(u), ascii(0), len(l), issimpletext(FALSE), maxl(m), islatin1(FALSE) { } - ~TQStringData() { if ( tqunicode ) delete[] ((char*)tqunicode); - if ( ascii ) delete[] ascii; } - - void deleteSelf(); - TQChar *tqunicode; - char *ascii; - void setDirty() { - if ( ascii ) { - delete [] ascii; - ascii = 0; - } - issimpletext = FALSE; - } -#ifdef TQ_OS_MAC9 - uint len; -#else - uint len : 30; -#endif - uint issimpletext : 1; -#ifdef TQ_OS_MAC9 - uint maxl; -#else - uint maxl : 30; -#endif - uint islatin1 : 1; - -private: -#if defined(TQ_DISABLE_COPY) - TQStringData( const TQStringData& ); - TQStringData& operator=( const TQStringData& ); -#endif -}; - - -class TQ_EXPORT TQString -{ -public: - TQString(); // make null string - TQString( TQChar ); // one-char string - TQString( const TQString & ); // impl-shared copy - TQString( const TQByteArray& ); // deep copy - TQString( const TQChar* tqunicode, uint length ); // deep copy -#ifndef TQT_NO_CAST_ASCII - TQString( const char *str ); // deep copy -#endif -#ifndef TQT_NO_STL - TQString( const std::string& ); // deep copy -#endif - ~TQString(); - -#ifdef USE_QT4 - // Interoperability - TQString( const QString &qs ); - operator QString() const; - TQString &operator=( const QString &qs ); -#endif // USE_QT4 - - TQString &operator=( const TQString & ); // impl-shared copy - TQString &operator=( const char * ); // deep copy -#ifndef TQT_NO_STL - TQString &operator=( const std::string& ); // deep copy -#endif - TQString &operator=( const TQCString& ); // deep copy - TQString &operator=( TQChar c ); - TQString &operator=( char c ); - - TQT_STATIC_CONST TQString null; - - bool isNull() const; - bool isEmpty() const; - uint length() const; - void truncate( uint pos ); - - TQString & fill( TQChar c, int len = -1 ); - - TQString copy() const; - - TQString arg( long a, int fieldWidth = 0, int base = 10 ) const; - TQString arg( ulong a, int fieldWidth = 0, int base = 10 ) const; - TQString arg( TQ_LLONG a, int fieldwidth=0, int base=10 ) const; - TQString arg( TQ_ULLONG a, int fieldwidth=0, int base=10 ) const; - TQString arg( int a, int fieldWidth = 0, int base = 10 ) const; - TQString arg( uint a, int fieldWidth = 0, int base = 10 ) const; - TQString arg( short a, int fieldWidth = 0, int base = 10 ) const; - TQString arg( ushort a, int fieldWidth = 0, int base = 10 ) const; - TQString arg( double a, int fieldWidth = 0, char fmt = 'g', - int prec = -1 ) const; - TQString arg( char a, int fieldWidth = 0 ) const; - TQString arg( TQChar a, int fieldWidth = 0 ) const; - TQString arg( const TQString& a, int fieldWidth = 0 ) const; - TQString arg( const TQString& a1, const TQString& a2 ) const; - TQString arg( const TQString& a1, const TQString& a2, - const TQString& a3 ) const; - TQString arg( const TQString& a1, const TQString& a2, const TQString& a3, - const TQString& a4 ) const; - -#ifndef TQT_NO_SPRINTF - TQString &sprintf( const char* format, ... ) -#if defined(TQ_CC_GNU) && !defined(__INSURE__) - __attribute__ ((format (printf, 2, 3))) -#endif - ; -#endif - - int find( TQChar c, int index=0, bool cs=TRUE ) const; - int find( char c, int index=0, bool cs=TRUE ) const; - int find( const TQString &str, int index=0, bool cs=TRUE ) const; -#ifndef TQT_NO_REGEXP - int find( const TQRegExp &, int index=0 ) const; -#endif -#ifndef TQT_NO_CAST_ASCII - int find( const char* str, int index=0 ) const; -#endif - int findRev( TQChar c, int index=-1, bool cs=TRUE) const; - int findRev( char c, int index=-1, bool cs=TRUE) const; - int findRev( const TQString &str, int index=-1, bool cs=TRUE) const; -#ifndef TQT_NO_REGEXP - int findRev( const TQRegExp &, int index=-1 ) const; -#endif -#ifndef TQT_NO_CAST_ASCII - int findRev( const char* str, int index=-1 ) const; -#endif - int contains( TQChar c, bool cs=TRUE ) const; - int contains( char c, bool cs=TRUE ) const - { return contains(TQChar(c), cs); } -#ifndef TQT_NO_CAST_ASCII - int contains( const char* str, bool cs=TRUE ) const; -#endif - int contains( const TQString &str, bool cs=TRUE ) const; -#ifndef TQT_NO_REGEXP - int contains( const TQRegExp & ) const; -#endif - - enum SectionFlags { - SectionDefault = 0x00, - SectionSkipEmpty = 0x01, - SectionIncludeLeadingSep = 0x02, - SectionIncludeTrailingSep = 0x04, - SectionCaseInsensitiveSeps = 0x08 - }; - TQString section( TQChar sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const; - TQString section( char sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const; -#ifndef TQT_NO_CAST_ASCII - TQString section( const char *in_sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const; -#endif - TQString section( const TQString &in_sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const; -#ifndef TQT_NO_REGEXP - TQString section( const TQRegExp ®, int start, int end = 0xffffffff, int flags = SectionDefault ) const; -#endif - - TQString left( uint len ) const; - TQString right( uint len ) const; - TQString mid( uint index, uint len=0xffffffff) const; - - TQString leftJustify( uint width, TQChar fill=' ', bool trunc=FALSE)const; - TQString rightJustify( uint width, TQChar fill=' ',bool trunc=FALSE)const; - - TQString lower() const; - TQString upper() const; - - TQString stripWhiteSpace() const; - TQString simplifyWhiteSpace() const; - - TQString &insert( uint index, const TQString & ); -#ifndef TQT_NO_CAST_ASCII - TQString &insert( uint index, const TQByteArray & ); - TQString &insert( uint index, const char * ); -#endif - TQString &insert( uint index, const TQChar*, uint len ); - TQString &insert( uint index, TQChar ); - TQString &insert( uint index, char c ) { return insert(index,TQChar(c)); } - TQString &append( char ); - TQString &append( TQChar ); - TQString &append( const TQString & ); -#ifndef TQT_NO_CAST_ASCII - TQString &append( const TQByteArray & ); - TQString &append( const char * ); -#endif -#if !defined(TQT_NO_STL) && !defined(TQT_NO_CAST_ASCII) - TQString &append( const std::string& ); -#endif - TQString &prepend( char ); - TQString &prepend( TQChar ); - TQString &prepend( const TQString & ); -#ifndef TQT_NO_CAST_ASCII - TQString &prepend( const TQByteArray & ); - TQString &prepend( const char * ); -#endif -#if !defined(TQT_NO_STL) && !defined(TQT_NO_CAST_ASCII) - TQString &prepend( const std::string& ); -#endif - TQString &remove( uint index, uint len ); -#if defined(TQ_TQDOC) - TQString &remove( const TQString & str, bool cs = TRUE ); -#else - // ### TQt 4.0: merge these two into one, and remove TQ_TQDOC hack - TQString &remove( const TQString & ); - TQString &remove( const TQString &, bool cs ); -#endif - TQString &remove( TQChar c ); - TQString &remove( char c ) - { return remove( TQChar(c) ); } -#ifndef TQT_NO_CAST_ASCII - TQString &remove( const char * ); -#endif -#ifndef TQT_NO_REGEXP - TQString &remove( const TQRegExp & ); -#endif - TQString &replace( uint index, uint len, const TQString & ); - TQString &replace( uint index, uint len, const TQChar*, uint clen ); - TQString &replace( uint index, uint len, TQChar ); - TQString &replace( uint index, uint len, char c ) - { return replace( index, len, TQChar(c) ); } -#if defined(TQ_TQDOC) - TQString &replace( TQChar c, const TQString & after, bool cs = TRUE ); - TQString &replace( char c, const TQString & after, bool cs = TRUE ); - TQString &replace( const TQString & before, const TQString & after, - bool cs = TRUE ); -#else - // ### TQt 4.0: merge these two into one, and remove TQ_TQDOC hack - TQString &replace( TQChar c, const TQString & ); - TQString &replace( TQChar c, const TQString &, bool ); - - // ### TQt 4.0: merge these two into one, and remove TQ_TQDOC hack - TQString &replace( char c, const TQString & after ) - { return replace( TQChar(c), after, TRUE ); } - TQString &replace( char c, const TQString & after, bool cs ) - { return replace( TQChar(c), after, cs ); } - - // ### TQt 4.0: merge these two into one, and remove TQ_TQDOC hack - TQString &replace( const TQString &, const TQString & ); - TQString &replace( const TQString &, const TQString &, bool ); -#endif -#ifndef TQT_NO_REGEXP_CAPTURE - TQString &replace( const TQRegExp &, const TQString & ); -#endif - TQString &replace( TQChar, TQChar ); - - short toShort( bool *ok=0, int base=10 ) const; - ushort toUShort( bool *ok=0, int base=10 ) const; - int toInt( bool *ok=0, int base=10 ) const; - uint toUInt( bool *ok=0, int base=10 ) const; - long toLong( bool *ok=0, int base=10 ) const; - ulong toULong( bool *ok=0, int base=10 ) const; - TQ_LLONG toLongLong( bool *ok=0, int base=10 ) const; - TQ_ULLONG toULongLong( bool *ok=0, int base=10 ) const; - float toFloat( bool *ok=0 ) const; - double toDouble( bool *ok=0 ) const; - - TQString &setNum( short, int base=10 ); - TQString &setNum( ushort, int base=10 ); - TQString &setNum( int, int base=10 ); - TQString &setNum( uint, int base=10 ); - TQString &setNum( long, int base=10 ); - TQString &setNum( ulong, int base=10 ); - TQString &setNum( TQ_LLONG, int base=10 ); - TQString &setNum( TQ_ULLONG, int base=10 ); - TQString &setNum( float, char f='g', int prec=6 ); - TQString &setNum( double, char f='g', int prec=6 ); - - static TQString number( long, int base=10 ); - static TQString number( ulong, int base=10); - static TQString number( TQ_LLONG, int base=10 ); - static TQString number( TQ_ULLONG, int base=10); - static TQString number( int, int base=10 ); - static TQString number( uint, int base=10); - static TQString number( double, char f='g', int prec=6 ); - - void setExpand( uint index, TQChar c ); - - TQString &operator+=( const TQString &str ); -#ifndef TQT_NO_CAST_ASCII - TQString &operator+=( const TQByteArray &str ); - TQString &operator+=( const char *str ); -#endif -#if !defined(TQT_NO_STL) && !defined(TQT_NO_CAST_ASCII) - TQString &operator+=( const std::string& ); -#endif - TQString &operator+=( TQChar c ); - TQString &operator+=( char c ); - - TQChar at( uint i ) const - { return i < d->len ? d->tqunicode[i] : TQChar::null; } - TQChar operator[]( int i ) const { if ((i<0) || (i>=length())) return TQChar::null; else return at((uint)i); } - TQCharRef at( uint i ); - TQCharRef operator[]( int i ); - - TQChar constref(uint i) const - { return at(i); } - TQChar& ref(uint i) - { // Optimized for easy-inlining by simple compilers. - if ( d->count != 1 || i >= d->len ) - subat( i ); - d->setDirty(); - return d->tqunicode[i]; - } - - const TQChar* tqunicode() const { return d->tqunicode; } - const char* ascii() const; - static TQString fromAscii(const char*, int len=-1); - const char* latin1() const; - static TQString tqfromLatin1(const char*, int len=-1); - TQCString utf8() const; - static TQString fromUtf8(const char*, int len=-1); - TQCString local8Bit() const; - static TQString fromLocal8Bit(const char*, int len=-1); - bool operator!() const; -#ifndef TQT_NO_ASCII_CAST - operator const char *() const { return ascii(); } -#endif -#ifndef TQT_NO_STL - operator std::string() const { return ascii() ? ascii() : ""; } -#endif - - static TQString fromUcs2( const unsigned short *ucs2 ); - const unsigned short *ucs2() const; - - TQString &setUnicode( const TQChar* tqunicode, uint len ); - TQString &setUnicodeCodes( const ushort* tqunicode_as_ushorts, uint len ); - TQString &setAscii( const char*, int len=-1 ); - TQString &setLatin1( const char*, int len=-1 ); - - int compare( const TQString& s ) const; - static int compare( const TQString& s1, const TQString& s2 ) - { return s1.compare( s2 ); } - - int localeAwareCompare( const TQString& s ) const; - static int localeAwareCompare( const TQString& s1, const TQString& s2 ) - { return s1.localeAwareCompare( s2 ); } - -#ifndef TQT_NO_DATASTREAM - friend TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQString & ); -#endif - - void compose(); - -#ifndef TQT_NO_COMPAT - const char* data() const { return ascii(); } -#endif - -#if defined(TQ_TQDOC) - bool startsWith( const TQString& str, bool cs = TRUE ) const; - bool endsWith( const TQString& str, bool cs = TRUE ) const; -#else - // ### TQt 4.0: merge these two into one, and remove TQ_TQDOC hack - bool startsWith( const TQString& str ) const; - bool startsWith( const TQString& str, bool cs ) const; - - // ### TQt 4.0: merge these two into one, and remove TQ_TQDOC hack - bool endsWith( const TQString& str ) const; - bool endsWith( const TQString& str, bool cs ) const; -#endif - - void setLength( uint newLength ); - - uint capacity() const; - void reserve( uint minCapacity ); - void squeeze(); - - bool simpleText() const { if ( !d->issimpletext ) checkSimpleText(); return (bool)d->issimpletext; } - bool isRightToLeft() const; - - -private: - TQString( int size, bool /* dummy */ ); // allocate size incl. \0 - - void deref(); - void real_detach(); - void subat( uint ); - TQString multiArg( int numArgs, const TQString& a1, const TQString& a2, - const TQString& a3 = TQString::null, - const TQString& a4 = TQString::null ) const; - - void checkSimpleText() const; - void grow( uint newLength ); -#ifndef TQT_NO_CAST_ASCII - TQString &insertHelper( uint index, const char *s, uint len=UINT_MAX ); - TQString &operatorPlusEqHelper( const char *s, uint len2=UINT_MAX ); -#endif - - static TQChar* latin1ToUnicode( const char*, uint * len, uint maxlen=(uint)-1 ); - static TQChar* latin1ToUnicode( const TQByteArray&, uint * len ); - static char* tqunicodeToLatin1( const TQChar*, uint len ); - - TQStringData *d; - static TQStringData* shared_null; - static TQStringData* makeSharedNull(); - - friend class TQConstString; - friend class TQTextStream; - TQString( TQStringData* dd, bool /* dummy */ ) : d(dd) { } - - // needed for TQDeepCopy - void detach(); - friend class TQDeepCopy<TQString>; -}; - -class TQ_EXPORT TQCharRef { - friend class TQString; - TQString& s; - uint p; - TQCharRef(TQString* str, uint pos) : s(*str), p(pos) { } - -public: - // most TQChar operations repeated here - - // all this is not documented: We just say "like TQChar" and let it be. -#ifndef TQ_TQDOC - ushort tqunicode() const { return s.constref(p).tqunicode(); } - char latin1() const { return s.constref(p).latin1(); } - - // An operator= for each TQChar cast constructors - TQCharRef operator=(char c ) { s.ref(p)=c; return *this; } - TQCharRef operator=(uchar c ) { s.ref(p)=c; return *this; } - TQCharRef operator=(TQChar c ) { s.ref(p)=c; return *this; } - TQCharRef operator=(const TQCharRef& c ) { s.ref(p)=c.tqunicode(); return *this; } - TQCharRef operator=(ushort rc ) { s.ref(p)=rc; return *this; } - TQCharRef operator=(short rc ) { s.ref(p)=rc; return *this; } - TQCharRef operator=(uint rc ) { s.ref(p)=rc; return *this; } - TQCharRef operator=(int rc ) { s.ref(p)=rc; return *this; } - - operator TQChar () const { return s.constref(p); } - - // each function... - bool isNull() const { return tqunicode()==0; } - bool isPrint() const { return s.constref(p).isPrint(); } - bool isPunct() const { return s.constref(p).isPunct(); } - bool isSpace() const { return s.constref(p).isSpace(); } - bool isMark() const { return s.constref(p).isMark(); } - bool isLetter() const { return s.constref(p).isLetter(); } - bool isNumber() const { return s.constref(p).isNumber(); } - bool isLetterOrNumber() { return s.constref(p).isLetterOrNumber(); } - bool isDigit() const { return s.constref(p).isDigit(); } - - int digitValue() const { return s.constref(p).digitValue(); } - TQChar lower() const { return s.constref(p).lower(); } - TQChar upper() const { return s.constref(p).upper(); } - - TQChar::Category category() const { return s.constref(p).category(); } - TQChar::Direction direction() const { return s.constref(p).direction(); } - TQChar::Joining joining() const { return s.constref(p).joining(); } - bool mirrored() const { return s.constref(p).mirrored(); } - TQChar mirroredChar() const { return s.constref(p).mirroredChar(); } - const TQString &decomposition() const { return s.constref(p).decomposition(); } - TQChar::Decomposition decompositionTag() const { return s.constref(p).decompositionTag(); } - unsigned char combiningClass() const { return s.constref(p).combiningClass(); } - - // Not the non-const ones of these. - uchar cell() const { return s.constref(p).cell(); } - uchar row() const { return s.constref(p).row(); } -#endif -}; - -inline TQCharRef TQString::at( uint i ) { return TQCharRef(this,i); } -inline TQCharRef TQString::operator[]( int i ) { return tqat((uint)i); } - - -class TQ_EXPORT TQConstString : private TQString { -public: - TQConstString( const TQChar* tqunicode, uint length ); - ~TQConstString(); - const TQString& string() const { return *this; } -}; - - -/***************************************************************************** - TQString stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQString & ); -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQString & ); -#endif - -/***************************************************************************** - TQString inline functions - *****************************************************************************/ - -// These two move code into makeSharedNull() and deletesData() -// to improve cache-coherence (and reduce code bloat), while -// keeping the common cases fast. -// -// No safe way to pre-init shared_null on ALL compilers/linkers. -inline TQString::TQString() : - d(shared_null ? shared_null : makeSharedNull()) -{ - d->ref(); -} -// -inline TQString::~TQString() -{ - if ( d->deref() ) { - if ( d != shared_null ) - d->deleteSelf(); - } -} - -// needed for TQDeepCopy -inline void TQString::detach() -{ real_detach(); } - -inline TQString TQString::section( TQChar sep, int start, int end, int flags ) const -{ return section(TQString(sep), start, end, flags); } - -inline TQString TQString::section( char sep, int start, int end, int flags ) const -{ return section(TQChar(sep), start, end, flags); } - -#ifndef TQT_NO_CAST_ASCII -inline TQString TQString::section( const char *in_sep, int start, int end, int flags ) const -{ return section(TQString(in_sep), start, end, flags); } -#endif - -inline TQString &TQString::operator=( TQChar c ) -{ *this = TQString(c); return *this; } - -inline TQString &TQString::operator=( char c ) -{ *this = TQString(TQChar(c)); return *this; } - -inline bool TQString::isNull() const -{ return tqunicode() == 0; } - -inline bool TQString::operator!() const -{ return isNull(); } - -inline uint TQString::length() const -{ return d->len; } - -inline uint TQString::capacity() const -{ return d->maxl; } - -inline bool TQString::isEmpty() const -{ return length() == 0; } - -inline TQString TQString::copy() const -{ return TQString( *this ); } - -#ifndef TQT_NO_CAST_ASCII -inline TQString &TQString::insert( uint index, const char *s ) -{ return insertHelper( index, s ); } - -inline TQString &TQString::insert( uint index, const TQByteArray &s ) -{ - int pos = s.find( 0 ); - return insertHelper( index, s, pos==-1 ? s.size() : pos ); -} -#endif - -inline TQString &TQString::prepend( const TQString & s ) -{ return insert(0,s); } - -inline TQString &TQString::prepend( TQChar c ) -{ return insert(0,c); } - -inline TQString &TQString::prepend( char c ) -{ return insert(0,c); } - -#ifndef TQT_NO_CAST_ASCII -inline TQString &TQString::prepend( const TQByteArray & s ) -{ return insert(0,s); } -#endif - -#ifndef TQT_NO_CAST_ASCII -inline TQString &TQString::operator+=( const TQByteArray &s ) -{ - int pos = s.find( 0 ); - return operatorPlusEqHelper( s, pos==-1 ? s.size() : pos ); -} -#endif - -inline TQString &TQString::append( const TQString & s ) -{ return operator+=(s); } - -#ifndef TQT_NO_CAST_ASCII -inline TQString &TQString::append( const TQByteArray &s ) -{ return operator+=(s); } - -inline TQString &TQString::append( const char * s ) -{ return operator+=(s); } -#endif - -inline TQString &TQString::append( TQChar c ) -{ return operator+=(c); } - -inline TQString &TQString::append( char c ) -{ return operator+=(c); } - -#ifndef TQT_NO_STL -inline TQString &TQString::operator=( const std::string& str ) -{ return operator=(str.c_str()); } -#ifndef TQT_NO_CAST_ASCII -inline TQString &TQString::operator+=( const std::string& s ) -{ return operator+=(s.c_str()); } -inline TQString &TQString::append( const std::string& s ) -{ return operator+=(s); } -inline TQString &TQString::prepend( const std::string& s ) -{ return insert(0, s); } -#endif -#endif - -inline TQString &TQString::setNum( short n, int base ) -{ return setNum((TQ_LLONG)n, base); } - -inline TQString &TQString::setNum( ushort n, int base ) -{ return setNum((TQ_ULLONG)n, base); } - -inline TQString &TQString::setNum( int n, int base ) -{ return setNum((TQ_LLONG)n, base); } - -inline TQString &TQString::setNum( uint n, int base ) -{ return setNum((TQ_ULLONG)n, base); } - -inline TQString &TQString::setNum( float n, char f, int prec ) -{ return setNum((double)n,f,prec); } - -inline TQString TQString::arg( int a, int fieldWidth, int base ) const -{ return arg( (TQ_LLONG)a, fieldWidth, base ); } - -inline TQString TQString::arg( uint a, int fieldWidth, int base ) const -{ return arg( (TQ_ULLONG)a, fieldWidth, base ); } - -inline TQString TQString::arg( short a, int fieldWidth, int base ) const -{ return arg( (TQ_LLONG)a, fieldWidth, base ); } - -inline TQString TQString::arg( ushort a, int fieldWidth, int base ) const -{ return arg( (TQ_ULLONG)a, fieldWidth, base ); } - -inline TQString TQString::arg( const TQString& a1, const TQString& a2 ) const { - return multiArg( 2, a1, a2 ); -} - -inline TQString TQString::arg( const TQString& a1, const TQString& a2, - const TQString& a3 ) const { - return multiArg( 3, a1, a2, a3 ); -} - -inline TQString TQString::arg( const TQString& a1, const TQString& a2, - const TQString& a3, const TQString& a4 ) const { - return multiArg( 4, a1, a2, a3, a4 ); -} - -inline int TQString::find( char c, int index, bool cs ) const -{ return find(TQChar(c), index, cs); } - -inline int TQString::findRev( char c, int index, bool cs ) const -{ return findRev( TQChar(c), index, cs ); } - -#ifndef TQT_NO_CAST_ASCII -inline int TQString::find( const char* str, int index ) const -{ return find(TQString::fromAscii(str), index); } - -inline int TQString::findRev( const char* str, int index ) const -{ return findRev(TQString::fromAscii(str), index); } -#endif - - -/***************************************************************************** - TQString non-member operators - *****************************************************************************/ - -TQ_EXPORT bool operator!=( const TQString &s1, const TQString &s2 ); -TQ_EXPORT bool operator<( const TQString &s1, const TQString &s2 ); -TQ_EXPORT bool operator<=( const TQString &s1, const TQString &s2 ); -TQ_EXPORT bool operator==( const TQString &s1, const TQString &s2 ); -TQ_EXPORT bool operator>( const TQString &s1, const TQString &s2 ); -TQ_EXPORT bool operator>=( const TQString &s1, const TQString &s2 ); -#ifndef TQT_NO_CAST_ASCII -TQ_EXPORT bool operator!=( const TQString &s1, const char *s2 ); -TQ_EXPORT bool operator<( const TQString &s1, const char *s2 ); -TQ_EXPORT bool operator<=( const TQString &s1, const char *s2 ); -TQ_EXPORT bool operator==( const TQString &s1, const char *s2 ); -TQ_EXPORT bool operator>( const TQString &s1, const char *s2 ); -TQ_EXPORT bool operator>=( const TQString &s1, const char *s2 ); -TQ_EXPORT bool operator!=( const char *s1, const TQString &s2 ); -TQ_EXPORT bool operator<( const char *s1, const TQString &s2 ); -TQ_EXPORT bool operator<=( const char *s1, const TQString &s2 ); -TQ_EXPORT bool operator==( const char *s1, const TQString &s2 ); -//TQ_EXPORT bool operator>( const char *s1, const TQString &s2 ); // MSVC++ -TQ_EXPORT bool operator>=( const char *s1, const TQString &s2 ); -#endif - -// Interoperability -TQ_EXPORT bool operator==( const QString &s1, const TQString &s2 ); - -TQ_EXPORT inline const TQString operator+( const TQString &s1, const TQString &s2 ) -{ - TQString tmp( s1 ); - tmp += s2; - return tmp; -} - -#ifndef TQT_NO_CAST_ASCII -TQ_EXPORT inline const TQString operator+( const TQString &s1, const char *s2 ) -{ - TQString tmp( s1 ); - tmp += TQString::fromAscii(s2); - return tmp; -} - -TQ_EXPORT inline const TQString operator+( const char *s1, const TQString &s2 ) -{ - TQString tmp = TQString::fromAscii( s1 ); - tmp += s2; - return tmp; -} -#endif - -TQ_EXPORT inline const TQString operator+( const TQString &s1, TQChar c2 ) -{ - TQString tmp( s1 ); - tmp += c2; - return tmp; -} - -TQ_EXPORT inline const TQString operator+( const TQString &s1, char c2 ) -{ - TQString tmp( s1 ); - tmp += c2; - return tmp; -} - -TQ_EXPORT inline const TQString operator+( TQChar c1, const TQString &s2 ) -{ - TQString tmp; - tmp += c1; - tmp += s2; - return tmp; -} - -TQ_EXPORT inline const TQString operator+( char c1, const TQString &s2 ) -{ - TQString tmp; - tmp += c1; - tmp += s2; - return tmp; -} - -#ifndef TQT_NO_STL -TQ_EXPORT inline const TQString operator+(const TQString& s1, const std::string& s2) -{ - return s1 + TQString(s2); -} - -TQ_EXPORT inline const TQString operator+(const std::string& s1, const TQString& s2) -{ - TQString tmp(s2); - return TQString(tmp.prepend(s1)); -} -#endif - - -#if defined(TQ_OS_WIN32) -extern TQ_EXPORT TQString qt_winTQString(void*); -extern TQ_EXPORT const void* qt_winTchar(const TQString& str, bool addnul); -extern TQ_EXPORT void* qt_winTchar_new(const TQString& str); -extern TQ_EXPORT TQCString qt_winTQString2MB( const TQString& s, int len=-1 ); -extern TQ_EXPORT TQString qt_winMB2TQString( const char* mb, int len=-1 ); -#endif - -#endif // USE_QT4 - -#define TQ_DEFINED_TQSTRING -#include "tqwinexport.h" -#endif // TQSTRING_H diff --git a/tqtinterface/qt4/src/tools/tqstringlist.cpp b/tqtinterface/qt4/src/tools/tqstringlist.cpp deleted file mode 100644 index 502b5dc..0000000 --- a/tqtinterface/qt4/src/tools/tqstringlist.cpp +++ /dev/null @@ -1,534 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQStringList -** -** Created : 990406 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqstringlist.h" - -#ifndef TQT_NO_STRINGLIST -#include "tqregexp.h" -#include "tqstrlist.h" -#include "tqdatastream.h" -#include "tqtl.h" - -#ifdef USE_QT4 - -#include <Qt/qstringlist.h> - -#endif - -/*! - \class TQStringList tqstringlist.h - \reentrant - \brief The TQStringList class provides a list of strings. - - \ingroup tools - \ingroup shared - \ingroup text - \mainclass - - It is used to store and manipulate strings that logically belong - together. Essentially TQStringList is a TQValueList of TQString - objects. Unlike TQStrList, which stores pointers to characters, - TQStringList holds real TQString objects. It is the class of choice - whenever you work with Unicode strings. TQStringList is part of the - \link tqtl.html TQt Template Library\endlink. - - Like TQString itself, TQStringList objects are implicitly shared, so - passing them around as value-parameters is both fast and safe. - - Strings can be added to a list using append(), operator+=() or - operator<<(), e.g. - \code - TQStringList fonts; - fonts.append( "Times" ); - fonts += "Courier"; - fonts += "Courier New"; - fonts << "Helvetica [Cronyx]" << "Helvetica [Adobe]"; - \endcode - - String lists have an iterator, TQStringList::Iterator(), e.g. - \code - for ( TQStringList::Iterator it = fonts.begin(); it != fonts.end(); ++it ) { - cout << *it << ":"; - } - cout << endl; - // Output: - // Times:Courier:Courier New:Helvetica [Cronyx]:Helvetica [Adobe]: - \endcode - - Many TQt functions return string lists by value; to iterate over - these you should make a copy and iterate over the copy. - - You can concatenate all the strings in a string list into a single - string (with an optional separator) using join(), e.g. - \code - TQString allFonts = fonts.join( ", " ); - cout << allFonts << endl; - // Output: - // Times, Courier, Courier New, Helvetica [Cronyx], Helvetica [Adobe] - \endcode - - You can sort the list with sort(), and extract a new list which - contains only those strings which contain a particular substring - (or match a particular regular expression) using the grep() - functions, e.g. - \code - fonts.sort(); - cout << fonts.join( ", " ) << endl; - // Output: - // Courier, Courier New, Helvetica [Adobe], Helvetica [Cronyx], Times - - TQStringList helveticas = fonts.grep( "Helvetica" ); - cout << helveticas.join( ", " ) << endl; - // Output: - // Helvetica [Adobe], Helvetica [Cronyx] - \endcode - - Existing strings can be split into string lists with character, - string or regular expression separators, e.g. - \code - TQString s = "Red\tGreen\tBlue"; - TQStringList colors = TQStringList::split( "\t", s ); - cout << colors.join( ", " ) << endl; - // Output: - // Red, Green, Blue - \endcode -*/ - -/*! - \fn TQStringList::TQStringList() - - Creates an empty string list. -*/ - -/*! - \fn TQStringList::TQStringList( const TQStringList& l ) - - Creates a copy of the list \a l. This function is very fast - because TQStringList is implicitly shared. In most situations this - acts like a deep copy, for example, if this list or the original - one or some other list referencing the same shared data is - modified, the modifying list first makes a copy, i.e. - copy-on-write. - In a threaded environment you may require a real deep copy - \omit see \l TQDeepCopy\endomit. -*/ - -/*! - \fn TQStringList::TQStringList (const TQString & i) - - Constructs a string list consisting of the single string \a i. - Longer lists are easily created as follows: - - \code - TQStringList items; - items << "Buy" << "Sell" << "Update" << "Value"; - \endcode -*/ - -/*! - \fn TQStringList::TQStringList (const char* i) - - Constructs a string list consisting of the single Latin-1 string \a i. -*/ - -/*! - \fn TQStringList::TQStringList( const TQValueList<TQString>& l ) - - Constructs a new string list that is a copy of \a l. -*/ - -/*! - Sorts the list of strings in ascending case-sensitive order. - - Sorting is very fast. It uses the \link tqtl.html TQt Template - Library's\endlink efficient HeapSort implementation that has a - time complexity of O(n*log n). - - If you want to sort your strings in an arbitrary order consider - using a TQMap. For example you could use a TQMap\<TQString,TQString\> - to create a case-insensitive ordering (e.g. mapping the lowercase - text to the text), or a TQMap\<int,TQString\> to sort the strings by - some integer index, etc. -*/ -void TQStringList::sort() -{ - qHeapSort( *this ); -} - -/*! - \overload - - This version of the function uses a TQChar as separator, rather - than a regular expression. - - \sa join() TQString::section() -*/ - -TQStringList TQStringList::split( const TQChar &sep, const TQString &str, - bool allowEmptyEntries ) -{ - return split( TQString(sep), str, allowEmptyEntries ); -} - -/*! - \overload - - This version of the function uses a TQString as separator, rather - than a regular expression. - - If \a sep is an empty string, the return value is a list of - one-character strings: split( TQString( "" ), "four" ) returns the - four-item list, "f", "o", "u", "r". - - If \a allowEmptyEntries is TRUE, a null string is inserted in - the list wherever the separator matches twice without intervening - text. - - \sa join() TQString::section() -*/ - -TQStringList TQStringList::split( const TQString &sep, const TQString &str, - bool allowEmptyEntries ) -{ - TQStringList lst; - - int j = 0; - int i = str.find( sep, j ); - - while ( i != -1 ) { - if ( i > j && i <= (int)str.length() ) - lst << str.mid( j, i - j ); - else if ( allowEmptyEntries ) - lst << TQString::null; - j = i + sep.length(); - i = str.find( sep, sep.length() > 0 ? j : j+1 ); - } - - int l = str.length() - 1; - if ( str.mid( j, l - j + 1 ).length() > 0 ) - lst << str.mid( j, l - j + 1 ); - else if ( allowEmptyEntries ) - lst << TQString::null; - - return lst; -} - -#ifndef TQT_NO_REGEXP -/*! - Splits the string \a str into strings wherever the regular - expression \a sep occurs, and returns the list of those strings. - - If \a allowEmptyEntries is TRUE, a null string is inserted in - the list wherever the separator matches twice without intervening - text. - - For example, if you split the string "a,,b,c" on commas, split() - returns the three-item list "a", "b", "c" if \a allowEmptyEntries - is FALSE (the default), and the four-item list "a", "", "b", "c" - if \a allowEmptyEntries is TRUE. - - If \a sep does not match anywhere in \a str, split() returns a - single element list with the element containing the single string - \a str. - - \sa join() TQString::section() -*/ - -TQStringList TQStringList::split( const TQRegExp &sep, const TQString &str, - bool allowEmptyEntries ) -{ - TQStringList lst; - - TQRegExp tep = sep; - - int j = 0; - int i = tep.search( str, j ); - - while ( i != -1 ) { - if ( str.mid( j, i - j ).length() > 0 ) - lst << str.mid( j, i - j ); - else if ( allowEmptyEntries ) - lst << TQString::null; - if ( tep.matchedLength() == 0 ) - j = i + 1; - else - j = i + tep.matchedLength(); - i = tep.search( str, j ); - } - - int l = str.length() - 1; - if ( str.mid( j, l - j + 1 ).length() > 0 ) - lst << str.mid( j, l - j + 1 ); - else if ( allowEmptyEntries ) - lst << TQString::null; - - return lst; -} -#endif - -/*! - Returns a list of all the strings containing the substring \a str. - - If \a cs is TRUE, the grep is done case-sensitively; otherwise - case is ignored. - - \code - TQStringList list; - list << "Bill Gates" << "John Doe" << "Bill Clinton"; - list = list.grep( "Bill" ); - // list == ["Bill Gates", "Bill Clinton"] - \endcode - - \sa TQString::find() -*/ - -TQStringList TQStringList::grep( const TQString &str, bool cs ) const -{ - TQStringList res; - for ( TQStringList::ConstIterator it = begin(); it != end(); ++it ) - if ( (*it).contains(str, cs) ) - res << *it; - - return res; -} - -#ifndef TQT_NO_REGEXP -/*! - \overload - - Returns a list of all the strings that match the regular - expression \a rx. - - \sa TQString::find() -*/ - -TQStringList TQStringList::grep( const TQRegExp &rx ) const -{ - TQStringList res; - for ( TQStringList::ConstIterator it = begin(); it != end(); ++it ) - if ( (*it).find(rx) != -1 ) - res << *it; - - return res; -} -#endif - -/*! - Replaces every occurrence of the string \a before in the strings - that constitute the string list with the string \a after. Returns - a reference to the string list. - - If \a cs is TRUE, the search is case sensitive; otherwise the - search is case insensitive. - - Example: - \code - TQStringList list; - list << "alpha" << "beta" << "gamma" << "epsilon"; - list.gres( "a", "o" ); - // list == ["olpho", "beto", "gommo", "epsilon"] - \endcode - - \sa TQString::replace() -*/ -TQStringList& TQStringList::gres( const TQString &before, const TQString &after, - bool cs ) -{ - TQStringList::Iterator it = begin(); - while ( it != end() ) { - (*it).replace( before, after, cs ); - ++it; - } - return *this; -} - -#ifndef TQT_NO_REGEXP_CAPTURE -/*! - \overload - - Replaces every occurrence of the regexp \a rx in the string - with \a after. Returns a reference to the string list. - - Example: - \code - TQStringList list; - list << "alpha" << "beta" << "gamma" << "epsilon"; - list.gres( TQRegExp("^a"), "o" ); - // list == ["olpha", "beta", "gamma", "epsilon"] - \endcode - - For regexps containing \link tqregexp.html#capturing-text - capturing parentheses \endlink, occurrences of <b>\\1</b>, - <b>\\2</b>, ..., in \a after are replaced with \a{rx}.cap(1), - cap(2), ... - - Example: - \code - TQStringList list; - list << "Bill Clinton" << "Gates, Bill"; - list.gres( TQRegExp("^(.*), (.*)$"), "\\2 \\1" ); - // list == ["Bill Clinton", "Bill Gates"] - \endcode - - \sa TQString::replace() -*/ -TQStringList& TQStringList::gres( const TQRegExp &rx, const TQString &after ) -{ - TQStringList::Iterator it = begin(); - while ( it != end() ) { - (*it).replace( rx, after ); - ++it; - } - return *this; -} - -#endif - -/*! - Joins the string list into a single string with each element - separated by the string \a sep (which can be empty). - - \sa split() -*/ -TQString TQStringList::join( const TQString &sep ) const -{ - TQString res; - bool alredy = FALSE; - for ( TQStringList::ConstIterator it = begin(); it != end(); ++it ) { - if ( alredy ) - res += sep; - alredy = TRUE; - res += *it; - } - - return res; -} - -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator>>( TQDataStream & s, TQStringList& l ) -{ - return s >> (TQValueList<TQString>&)l; -} - -TQ_EXPORT TQDataStream &operator<<( TQDataStream & s, const TQStringList& l ) -{ - return s << (const TQValueList<TQString>&)l; -} -#endif - -/*! - Converts from an ASCII-TQStrList \a ascii to a TQStringList (Unicode). -*/ -TQStringList TQStringList::fromStrList(const TQStrList& ascii) -{ - TQStringList res; - const char * s; - for ( TQStrListIterator it(ascii); (s=it.current()); ++it ) - res << s; - return res; -} - -/*! \fn void TQStringList::detach() - \reimp -*/ - -#ifdef USE_QT4 - -// Interoperability -// [FIXME] -// These conversions are probably too weak - -#if 0 -/*! - QT4 INTEROPERABILITY -*/ -TQStringList::TQStringList( const QStringList &qs ) -{ - setAscii( TQString(qs).ascii() ); -} - -/*! - QT4 INTEROPERABILITY -*/ -TQStringList::operator QStringList() const -{ - return QStringList::fromUtf8( this->utf8() ); -} -#endif - -/*! - QT4 INTEROPERABILITY -*/ -TQStringList::operator QStringList() const -{ - QStringList qn; - for (int i = 0; i < size(); ++i) { - qn.append(*at(i)); - } - return qn; -} - -/*! - QT4 INTEROPERABILITY -*/ -// TQStringList TQStringList::operator=( const QStringList qs ) -// { -// TQStringList qn; -// for (int i = 0; i < qs.size(); ++i) { -// qn.append(qs.at(i)); -// } -// return qn; -// } - -/*! - QT4 INTEROPERABILITY -*/ -TQStringList TQStringList::convertFromQStringList( const QStringList qs ) -{ - TQStringList qn; - for (int i = 0; i < qs.size(); ++i) { - qn.append(qs.at(i)); - } - return qn; -} - -#endif // USE_QT4 - -#endif //TQT_NO_STRINGLIST diff --git a/tqtinterface/qt4/src/tools/tqstringlist.h b/tqtinterface/qt4/src/tools/tqstringlist.h deleted file mode 100644 index 6ca6802..0000000 --- a/tqtinterface/qt4/src/tools/tqstringlist.h +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************************** -** -** Definition of TQStringList class -** -** Created : 990406 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQSTRINGLIST_H -#define TQSTRINGLIST_H - -#include "tqtglobaldefines.h" - -#ifndef TQT_H -#include "tqvaluelist.h" -#include "tqstring.h" -#include "tqstrlist.h" -#endif // TQT_H - -#ifndef TQT_NO_STRINGLIST - -class TQRegExp; -template <class T> class TQDeepCopy; - -#if defined(TQ_TEMPLATEDLL) -// TQMOC_SKIP_BEGIN -//TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueList<TQString>; -// TQMOC_SKIP_END -#endif - -class TQ_EXPORT TQStringList : public TQValueList<TQString> -{ -public: - TQStringList() { } - TQStringList( const TQStringList& l ) : TQValueList<TQString>(l) { } - TQStringList( const TQValueList<TQString>& l ) : TQValueList<TQString>(l) { } - TQStringList( const TQString& i ) { append(i); } -#ifndef TQT_NO_CAST_ASCII - TQStringList( const char* i ) { append(i); } -#endif - - static TQStringList fromStrList(const TQStrList&); - - void sort(); - - static TQStringList split( const TQString &sep, const TQString &str, bool allowEmptyEntries = FALSE ); - static TQStringList split( const TQChar &sep, const TQString &str, bool allowEmptyEntries = FALSE ); -#ifndef TQT_NO_REGEXP - static TQStringList split( const TQRegExp &sep, const TQString &str, bool allowEmptyEntries = FALSE ); -#endif - TQString join( const TQString &sep ) const; - - TQStringList grep( const TQString &str, bool cs = TRUE ) const; -#ifndef TQT_NO_REGEXP - TQStringList grep( const TQRegExp &expr ) const; -#endif - - TQStringList& gres( const TQString &before, const TQString &after, - bool cs = TRUE ); -#ifndef TQT_NO_REGEXP_CAPTURE - TQStringList& gres( const TQRegExp &expr, const TQString &after ); -#endif - -#ifdef USE_QT4 - // Interoperability -// TQStringList( const QStringList &qs ); - operator QStringList() const; -// TQStringList operator=( const QStringList qs ); - static TQStringList convertFromQStringList( const QStringList qs ); -#endif // USE_QT4 - -protected: - void detach() { TQValueList<TQString>::detach(); } - friend class TQDeepCopy< TQStringList >; -}; - -#ifndef TQT_NO_DATASTREAM -class TQDataStream; -extern TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQStringList& ); -extern TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQStringList& ); -#endif - -#endif // TQT_NO_STRINGLIST -#endif // TQSTRINGLIST_H diff --git a/tqtinterface/qt4/src/tools/tqstrlist.h b/tqtinterface/qt4/src/tools/tqstrlist.h deleted file mode 100644 index 5dbc9c8..0000000 --- a/tqtinterface/qt4/src/tools/tqstrlist.h +++ /dev/null @@ -1,175 +0,0 @@ -/**************************************************************************** -** -** Definition of TQStrList, TQStrIList and TQStrListIterator classes -** -** Created : 920730 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQSTRLIST_H -#define TQSTRLIST_H - -#ifndef TQT_H -#include "tqstring.h" -#include "tqptrlist.h" -#include "tqdatastream.h" -#endif // TQT_H - -#ifdef USE_QT4 - -#include <Qt/qlist.h> - -#endif // USE_QT4 - -#if defined(TQ_TQDOC) -class TQStrListIterator : public TQPtrListIterator<char> -{ -}; -#else -typedef TQPtrListIterator<char> TQStrListIterator; -#endif - -class TQ_EXPORT TQStrList : public TQPtrList<char> -{ -public: - TQStrList( bool deepCopies=TRUE ) { dc = deepCopies; del_item = deepCopies; } - TQStrList( const TQStrList & ); - ~TQStrList() { clear(); } - TQStrList& operator=( const TQStrList & ); - -#ifdef USE_QT4 - // Interoperability -// TQStrList( const QList<QByteArray> &ql ); -// operator QStrList() const; -// TQStrList &operator=( const QList<QByteArray> &ql ); -// TQStrList convertFromQStrList( const QList<QByteArray> &ql ); - -#endif // USE_QT4 - -private: - TQPtrCollection::Item newItem( TQPtrCollection::Item d ) { return dc ? qstrdup( (const char*)d ) : d; } - void deleteItem( TQPtrCollection::Item d ) { if ( del_item ) delete[] (char*)d; } - int compareItems( TQPtrCollection::Item s1, TQPtrCollection::Item s2 ) { return qstrcmp((const char*)s1, - (const char*)s2); } -#ifndef TQT_NO_DATASTREAM - TQDataStream &read( TQDataStream &s, TQPtrCollection::Item &d ) - { s >> (char *&)d; return s; } - QDataStream &write( QDataStream &s, TQPtrCollection::Item d ) const - { return s << (const char *)d; } -#endif - bool dc; -}; - - -class TQ_EXPORT TQStrIList : public TQStrList // case insensitive string list -{ -public: - TQStrIList( bool deepCopies=TRUE ) : TQStrList( deepCopies ) {} - ~TQStrIList() { clear(); } -private: - int compareItems( TQPtrCollection::Item s1, TQPtrCollection::Item s2 ) - { return qstricmp((const char*)s1, - (const char*)s2); } -}; - - -inline TQStrList & TQStrList::operator=( const TQStrList &strList ) -{ - clear(); - dc = strList.dc; - del_item = dc; - TQPtrList<char>::operator=( strList ); - return *this; -} - -inline TQStrList::TQStrList( const TQStrList &strList ) - : TQPtrList<char>( strList ) -{ - dc = FALSE; - operator=( strList ); -} - -#ifdef USE_QT4 - -// Interoperability -// FIXME -// These conversions are probably too weak - -#if 0 -/*! - QT4 INTEROPERABILITY -*/ -TQStringList::TQStringList( const QList<QByteArray> &ql ) -{ - setAscii( TQString(qs).ascii() ); -} - -/*! - QT4 INTEROPERABILITY -*/ -TQStringList::operator QStringList() const -{ - return QStringList::fromUtf8( this->utf8() ); -} - -/*! - QT4 INTEROPERABILITY -*/ -TQStringList &TQStringList::operator=( const QList<QByteArray> &ql ) -{ - TQStringList qn; - for (int i = 0; i < qs.size(); ++i) { - qn.append(qs.at(i)); - } - return qn; -} - -#endif - -/*! - QT4 INTEROPERABILITY -*/ -inline TQStrList convertFromQStrList( const QList<QByteArray> &ql ) -{ - TQStrList qn; - qn.clear(); - for (int i = 0; i < ql.size(); ++i) - qn.append(ql.at(i).constData()); - return qn; -} - -#endif // USE_QT4 - -#endif // TQSTRLIST_H diff --git a/tqtinterface/qt4/src/tools/tqstrvec.h b/tqtinterface/qt4/src/tools/tqstrvec.h deleted file mode 100644 index d3a35bf..0000000 --- a/tqtinterface/qt4/src/tools/tqstrvec.h +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** -** -** Definition of TQStrVec and TQStrIVec classes -** -** Created : 931203 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQSTRVEC_H -#define TQSTRVEC_H - -#ifndef TQT_H -#include "tqstring.h" -#include "tqptrvector.h" -#include "tqdatastream.h" -#endif // TQT_H - -class TQ_EXPORT TQStrVec : public TQPtrVector<char> -{ -public: - TQStrVec() { dc = TRUE; } - TQStrVec( uint size, bool deepc = TRUE ) : TQPtrVector<char>(size) {dc=deepc;} - ~TQStrVec() { clear(); } -private: - Item newItem( Item d ) { return dc ? qstrdup( (const char*)d ) : d; } - void deleteItem( Item d ) { if ( dc ) delete[] (char*)d; } - int compareItems( Item s1, Item s2 ) - { return qstrcmp((const char*)s1, - (const char*)s2); } -#ifndef TQT_NO_DATASTREAM - TQDataStream &read( TQDataStream &s, Item &d ) - { s >> (char *&)d; return s; } - TQDataStream &write( TQDataStream &s, Item d ) const - { return s << (const char*)d; } -#endif - bool dc; -}; - - -class TQ_EXPORT TQStrIVec : public TQStrVec // case insensitive string vec -{ -public: - TQStrIVec() {} - TQStrIVec( uint size, bool dc = TRUE ) : TQStrVec( size, dc ) {} - ~TQStrIVec() { clear(); } -private: - int compareItems( Item s1, Item s2 ) - { return qstricmp((const char*)s1, - (const char*)s2); } -}; - - -#endif // TQSTRVEC_H diff --git a/tqtinterface/qt4/src/tools/tqtextstream.cpp b/tqtinterface/qt4/src/tools/tqtextstream.cpp deleted file mode 100644 index ca4b11e..0000000 --- a/tqtinterface/qt4/src/tools/tqtextstream.cpp +++ /dev/null @@ -1,2663 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQTextStream class -** -** Created : 940922 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqtextstream.h" - -#ifndef TQT_NO_TEXTSTREAM -#include "tqtextcodec.h" -#include "tqregexp.h" -#include "tqbuffer.h" -#include "tqfile.h" -#include <stdio.h> -#include <ctype.h> -#include <stdlib.h> -#ifndef TQ_OS_TEMP -#include <locale.h> -#endif - -#if defined(TQ_OS_WIN32) -#include "tqt_windows.h" -#endif - -/*! - \class TQTextStream tqtextstream.h - \reentrant - \brief The TQTextStream class provides basic functions for reading - and writing text using a TQIODevice. - - \ingroup io - \ingroup text - \mainclass - - The text stream class has a functional interface that is very - similar to that of the standard C++ iostream class. - - TQt provides several global functions similar to the ones in iostream: - \table - \header \i Function \i Meaning - \row \i bin \i sets the TQTextStream to read/write binary numbers - \row \i oct \i sets the TQTextStream to read/write octal numbers - \row \i dec \i sets the TQTextStream to read/write decimal numbers - \row \i hex \i sets the TQTextStream to read/write hexadecimal numbers - \row \i endl \i forces a line break - \row \i flush \i forces the TQIODevice to flush any buffered data - \row \i ws \i eats any available whitespace (on input) - \row \i reset \i resets the TQTextStream to its default mode (see reset()) - \row \i qSetW(int) \i sets the \link width() field width \endlink - to the given argument - \row \i qSetFill(int) \i sets the \link fill() fill character - \endlink to the given argument - \row \i qSetPrecision(int) \i sets the \link precision() precision - \endlink to the given argument - \endtable - - \warning By default TQTextStream will automatically detect whether - integers in the stream are in decimal, octal, hexadecimal or - binary format when reading from the stream. In particular, a - leading '0' signifies octal, i.e. the sequence "0100" will be - interpreted as 64. - - The TQTextStream class reads and writes text; it is not appropriate - for dealing with binary data (but TQDataStream is). - - By default, output of Unicode text (i.e. TQString) is done using - the local 8-bit encoding. This can be changed using the - setEncoding() method. For input, the TQTextStream will auto-detect - standard Unicode "byte order marked" text files; otherwise the - local 8-bit encoding is used. - - The TQIODevice is set in the constructor, or later using - setDevice(). If the end of the input is reached atEnd() returns - TRUE. Data can be read into variables of the appropriate type - using the operator>>() overloads, or read in its entirety into a - single string using read(), or read a line at a time using - readLine(). Whitespace can be skipped over using skipWhiteSpace(). - You can set flags for the stream using flags() or setf(). The - stream also supports width(), precision() and fill(); use reset() - to reset the defaults. - - \sa TQDataStream -*/ - -/*! - \enum TQTextStream::Encoding - - \value Locale - \value Latin1 - \value Unicode - \value UnicodeNetworkOrder - \value UnicodeReverse - \value RawUnicode - \value UnicodeUTF8 - - See setEncoding() for an explanation of the encodings. -*/ - -/* - \class TQTSManip - - \brief The TQTSManip class is an internal helper class for the - TQTextStream. - - It is generally a very bad idea to use this class directly in - application programs. - - \internal - - This class makes it possible to give the TQTextStream function objects - with arguments, like this: - \code - TQTextStream cout( stdout, IO_WriteOnly ); - cout << setprecision( 8 ); // TQTSManip used here! - cout << 3.14159265358979323846; - \endcode - - The setprecision() function returns a TQTSManip object. - The TQTSManip object contains a pointer to a member function in - TQTextStream and an integer argument. - When serializing a TQTSManip into a TQTextStream, the function - is executed with the argument. -*/ - -/*! \fn TQTSManip::TQTSManip( TQTSMFI m, int a ) - - Constructs a TQTSManip object which will call \a m (a member function - in TQTextStream which accepts a single int) with argument \a a when - TQTSManip::exec() is called. Used internally in e.g. endl: - - \code - s << "some text" << endl << "more text"; - \endcode -*/ - -/*! \fn void TQTSManip::exec( TQTextStream& s ) - - Calls the member function specified in the constructor, for object - \a s. Used internally in e.g. endl: - - \code - s << "some text" << endl << "more text"; - \endcode -*/ - - -/***************************************************************************** - TQTextStream member functions - *****************************************************************************/ - -#if defined(TQT_CHECK_STATE) -#undef CHECK_STREAM_PRECOND -#define CHECK_STREAM_PRECOND if ( !dev ) { \ - qWarning( "TQTextStream: No tqdevice" ); \ - return *this; } -#else -#define CHECK_STREAM_PRECOND -#endif - - -#define I_SHORT 0x0010 -#define I_INT 0x0020 -#define I_LONG 0x0030 -#define I_TYPE_MASK 0x00f0 - -#define I_BASE_2 TQTS::bin -#define I_BASE_8 TQTS::oct -#define I_BASE_10 TQTS::dec -#define I_BASE_16 TQTS::hex -#define I_BASE_MASK (TQTS::bin | TQTS::oct | TQTS::dec | TQTS::hex) - -#define I_SIGNED 0x0100 -#define I_UNSIGNED 0x0200 -#define I_SIGN_MASK 0x0f00 - - -static const TQChar TQEOF = TQChar((ushort)0xffff); //guaranteed not to be a character. -static const uint getline_buf_size = 256; // bufsize used by ts_getline() - -const int TQTextStream::basefield = I_BASE_MASK; -const int TQTextStream::adjustfield = ( TQTextStream::left | - TQTextStream::right | - TQTextStream::internal ); -const int TQTextStream::floatfield = ( TQTextStream::scientific | - TQTextStream::fixed ); - - -class TQTextStreamPrivate { -public: -#ifndef TQT_NO_TEXTCODEC - TQTextStreamPrivate() - : decoder( 0 ), encoder( 0 ), sourceType( NotSet ) { } - ~TQTextStreamPrivate() { - delete decoder; - delete encoder; - } - TQTextDecoder *decoder; - TQTextEncoder *encoder; -#else - TQTextStreamPrivate() : sourceType( NotSet ) { } - ~TQTextStreamPrivate() { } -#endif - TQString ungetcBuf; - - enum SourceType { NotSet, IODevice, String, ByteArray, File }; - SourceType sourceType; -}; - - -// skips whitespace and returns the first non-whitespace character -TQChar TQTextStream::eat_ws() -{ - TQChar c; - do { c = ts_getc(); } while ( c != TQEOF && ts_isspace(c) ); - return c; -} - -void TQTextStream::init() -{ - // ### ungetcBuf = TQEOF; - dev = 0; - owndev = FALSE; - mapper = 0; - d = new TQTextStreamPrivate; - doUnicodeHeader = TRUE; // autodetect - latin1 = TRUE; // should use locale? - internalOrder = TQChar::networkOrdered(); - networkOrder = TRUE; -} - -/*! - Constructs a data stream that has no IO tqdevice. -*/ - -TQTextStream::TQTextStream() -{ - init(); - setEncoding( Locale ); - reset(); - d->sourceType = TQTextStreamPrivate::NotSet; -} - -/*! - Constructs a text stream that uses the IO tqdevice \a iod. -*/ - -TQTextStream::TQTextStream( QIODevice *iod ) -{ - init(); - setEncoding( Locale ); - dev = TQT_TQIODEVICE(iod); - reset(); - d->sourceType = TQTextStreamPrivate::IODevice; -} - -/*! - Constructs a text stream that uses the IO tqdevice \a iod. -*/ - -TQTextStream::TQTextStream( QFile *iod ) -{ - init(); - setEncoding( Locale ); - dev = TQT_TQIODEVICE(iod); - reset(); - d->sourceType = TQTextStreamPrivate::IODevice; -} - -// TODO: use special-case handling of this case in TQTextStream, and -// simplify this class to only deal with TQChar or TQString data. -class TQStringBuffer : public TQIODevice { -public: - TQStringBuffer( TQString* str ); - ~TQStringBuffer(); - bool open( int m ); - void close(); - void flush(); -#ifdef USE_QT4 - qint64 size() const; -#else - Offset size() const; -#endif - Offset at() const; - bool at( Offset pos ); -#ifdef USE_QT4 - qint64 readData( char *p, qint64 len ); - qint64 writeData( const char *p, qint64 len ); -#else - TQ_LONG readBlock( char *p, TQ_ULONG len ); - TQ_LONG writeBlock( const char *p, TQ_ULONG len ); -#endif - int getch(); - int putch( int ch ); - int ungetch( int ch ); -protected: - TQString* s; - -private: - TQStringBuffer( const TQStringBuffer & ); - TQStringBuffer &operator=( const TQStringBuffer & ); -}; - - -TQStringBuffer::TQStringBuffer( TQString* str ) -{ - s = str; -} - -TQStringBuffer::~TQStringBuffer() -{ -} - - -bool TQStringBuffer::open( int m ) -{ - if ( !s ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQStringBuffer::open: No string" ); -#endif - return FALSE; - } - if ( isOpen() ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQStringBuffer::open: Buffer already open" ); -#endif - return FALSE; - } - setMode( m ); - if ( m & IO_Truncate ) - s->truncate( 0 ); - - if ( m & IO_Append ) { - seek(s->length()*sizeof(TQChar)); - } else { - seek(0); - } - setState( IO_Open ); - resetqStatus(); - return TRUE; -} - -void TQStringBuffer::close() -{ - if ( isOpen() ) { - setFlags( IO_Direct ); - seek(0); - } -} - -void TQStringBuffer::flush() -{ -} - -#ifdef USE_QT4 -qint64 TQStringBuffer::size() const -#else -TQIODevice::Offset TQStringBuffer::size() const -#endif -{ - return s ? s->length()*sizeof(TQChar) : 0; -} - -TQIODevice::Offset TQStringBuffer::at() const -{ - return pos(); -} - -bool TQStringBuffer::at( Offset pos ) -{ -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { - qWarning( "TQStringBuffer::at: Buffer is not open" ); - return FALSE; - } -#endif - if ( pos >= s->length()*2 ) { -#if defined(TQT_CHECK_RANGE) -#if defined(TQT_ABI_QT4) - qWarning( "TQStringBuffer::at: Index %lld out of range", pos ); -#else - qWarning( "TQStringBuffer::at: Index %lu out of range", pos ); -#endif -#endif - return FALSE; - } - seek(pos); - return TRUE; -} - -#ifdef USE_QT4 -qint64 TQStringBuffer::readData( char *p, qint64 len ) -#else -TQ_LONG TQStringBuffer::readBlock( char *p, TQ_ULONG len ) -#endif -{ -#if defined(TQT_CHECK_STATE) - TQ_CHECK_PTR( p ); - if ( !isOpen() ) { - qWarning( "TQStringBuffer::readBlock: Buffer not open" ); - return -1; - } - if ( !isReadable() ) { - qWarning( "TQStringBuffer::readBlock: Read operation not permitted" ); - return -1; - } -#endif - if ( pos() + len > s->length()*sizeof(TQChar) ) { - // overflow - if ( (uint)pos() >= s->length()*sizeof(TQChar) ) { - setqStatus( IO_ReadError ); - return -1; - } else { - len = s->length()*2 - (uint)pos(); - } - } - memcpy( p, ((const char*)(s->tqunicode()))+pos(), len ); - seek(pos()+len); - return len; -} - -#ifdef USE_QT4 -qint64 TQStringBuffer::writeData( const char *p, qint64 len ) -#else -TQ_LONG TQStringBuffer::writeBlock( const char *p, TQ_ULONG len ) -#endif -{ -#if defined(TQT_CHECK_NULL) - if ( p == 0 && len != 0 ) - qWarning( "TQStringBuffer::writeBlock: Null pointer error" ); -#endif -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { - qWarning( "TQStringBuffer::writeBlock: Buffer not open" ); - return -1; - } - if ( !isWritable() ) { - qWarning( "TQStringBuffer::writeBlock: Write operation not permitted" ); - return -1; - } - if ( pos()&1 ) { - qWarning( "TQStringBuffer::writeBlock: non-even index - non Unicode" ); - return -1; - } - if ( len&1 ) { - qWarning( "TQStringBuffer::writeBlock: non-even length - non Unicode" ); - return -1; - } -#endif - s->replace(pos()/2, len/2, (TQChar*)p, len/2); - seek(pos()+len); - return len; -} - -int TQStringBuffer::getch() -{ -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { - qWarning( "TQStringBuffer::getch: Buffer not open" ); - return -1; - } - if ( !isReadable() ) { - qWarning( "TQStringBuffer::getch: Read operation not permitted" ); - return -1; - } -#endif - if ( (uint)pos() >= s->length()*2 ) { // overflow - setqStatus( IO_ReadError ); - return -1; - } - int retval = (int)((const uchar *)s->tqunicode())[pos()]; - seek(pos()+1); - return retval; -} - -int TQStringBuffer::putch( int ch ) -{ - char c = ch; - if ( writeBlock(&c,1) < 0 ) - return -1; - else - return ch; -} - -int TQStringBuffer::ungetch( int ch ) -{ -#if defined(TQT_CHECK_STATE) - if ( !isOpen() ) { - qWarning( "TQStringBuffer::ungetch: Buffer not open" ); - return -1; - } - if ( !isReadable() ) { - qWarning( "TQStringBuffer::ungetch: Read operation not permitted" ); - return -1; - } -#endif - if ( ch != -1 ) { // something to do with eof - if ( pos() ) - seek(pos()-1); - else - ch = -1; - } - return ch; -} - - -/*! - Constructs a text stream that operates on the Unicode TQString, \a - str, through an internal tqdevice. The \a filemode argument is - passed to the tqdevice's open() function; see \l{TQIODevice::mode()}. - - If you set an encoding or codec with setEncoding() or setCodec(), - this setting is ignored for text streams that operate on TQString. - - Example: - \code - TQString str; - TQTextStream ts( &str, IO_WriteOnly ); - ts << "pi = " << 3.14; // str == "pi = 3.14" - \endcode - - Writing data to the text stream will modify the contents of the - string. The string will be expanded when data is written beyond - the end of the string. Note that the string will not be truncated: - \code - TQString str = "pi = 3.14"; - TQTextStream ts( &str, IO_WriteOnly ); - ts << "2+2 = " << 2+2; // str == "2+2 = 414" - \endcode - - Note that because TQString is Unicode, you should not use - readRawBytes() or writeRawBytes() on such a stream. -*/ - -TQTextStream::TQTextStream( TQString* str, int filemode ) -{ - // TODO: optimize for this case as it becomes more common - // (see TQStringBuffer above) - init(); - dev = new TQStringBuffer( str ); - ((TQStringBuffer *)dev)->open( filemode ); - owndev = TRUE; - setEncoding(RawUnicode); - reset(); - d->sourceType = TQTextStreamPrivate::String; -} - -/*! \obsolete - - This constructor is equivalent to the constructor taking a TQString* - parameter. -*/ - -TQTextStream::TQTextStream( TQString& str, int filemode ) -{ - init(); - dev = new TQStringBuffer( &str ); - ((TQStringBuffer *)dev)->open( filemode ); - owndev = TRUE; - setEncoding(RawUnicode); - reset(); - d->sourceType = TQTextStreamPrivate::String; -} - -/*! - Constructs a text stream that operates on the byte array, \a a, - through an internal TQBuffer tqdevice. The \a mode argument is passed - to the tqdevice's open() function; see \l{TQIODevice::mode()}. - - Example: - \code - TQByteArray array; - TQTextStream ts( array, IO_WriteOnly ); - ts << "pi = " << 3.14 << '\0'; // array == "pi = 3.14" - \endcode - - Writing data to the text stream will modify the contents of the - array. The array will be expanded when data is written beyond the - end of the string. - - Same example, using a TQBuffer: - \code - TQByteArray array; - TQBuffer buf( array ); - buf.open( IO_WriteOnly ); - TQTextStream ts( &buf ); - ts << "pi = " << 3.14 << '\0'; // array == "pi = 3.14" - buf.close(); - \endcode -*/ - -TQTextStream::TQTextStream( TQByteArray a, int mode ) -{ - init(); - dev = TQT_TQIODEVICE(new TQBuffer( a )); - ((TQBuffer *)dev)->open( (QIODevice::OpenModeFlag)mode ); - owndev = TRUE; - setEncoding( Latin1 ); //### Locale??? - reset(); - d->sourceType = TQTextStreamPrivate::ByteArray; -} - -/*! - Constructs a text stream that operates on an existing file handle - \a fh through an internal TQFile tqdevice. The \a mode argument is - passed to the tqdevice's open() function; see \l{TQIODevice::mode()}. - - Note that if you create a TQTextStream \c cout or another name that - is also used for another variable of a different type, some - linkers may confuse the two variables, which will often cause - crashes. -*/ - -TQTextStream::TQTextStream( FILE *fh, int mode ) -{ - init(); - setEncoding( Locale ); //### - dev = TQT_TQIODEVICE(new TQFile); - ((TQFile *)dev)->open( mode, fh ); - owndev = TRUE; - reset(); - d->sourceType = TQTextStreamPrivate::File; -} - -/*! - Destroys the text stream. - - The destructor does not affect the current IO tqdevice. -*/ - -TQTextStream::~TQTextStream() -{ - if ( owndev ) - delete dev; - delete d; -} - -/*! - Positions the read pointer at the first non-whitespace character. -*/ -void TQTextStream::skipWhiteSpace() -{ - ts_ungetc( eat_ws() ); -} - -/*! - Internal. -*/ -int TQTextStream::dev_getch() { - if (d->sourceType == TQTextStreamPrivate::String) - return static_cast<TQStringBuffer*>(dev)->getch(); - else - return dev->getch(); -} - -/*! - Internal. -*/ -int TQTextStream::dev_ungetch(int ch) { - if (d->sourceType == TQTextStreamPrivate::String) - return static_cast<TQStringBuffer*>(dev)->ungetch(ch); - else - return dev->ungetch(ch); -} - -/*! - Tries to read \a len characters from the stream and stores them in - \a buf. Returns the number of characters really read. - - \warning There will no TQEOF appended if the read reaches the end - of the file. EOF is reached when the return value does not equal - \a len. -*/ -uint TQTextStream::ts_getbuf( TQChar* buf, uint len ) -{ - if ( len < 1 ) - return 0; - - uint rnum = 0; // the number of TQChars really read - - if ( d && d->ungetcBuf.length() ) { - while ( rnum < len && rnum < d->ungetcBuf.length() ) { - *buf = d->ungetcBuf.constref( rnum ); - buf++; - rnum++; - } - d->ungetcBuf = d->ungetcBuf.mid( rnum ); - if ( rnum >= len ) - return rnum; - } - - // we use dev_ungetch() for one of the bytes of the tqunicode - // byte-order mark, but a local unget hack for the other byte: - int ungetHack = EOF; - - if ( doUnicodeHeader ) { - doUnicodeHeader = FALSE; // only at the top - int c1 = dev_getch(); - if ( c1 == EOF ) - return rnum; - int c2 = dev_getch(); - if ( c1 == 0xfe && c2 == 0xff ) { - mapper = 0; - latin1 = FALSE; - internalOrder = TQChar::networkOrdered(); - networkOrder = TRUE; - } else if ( c1 == 0xff && c2 == 0xfe ) { - mapper = 0; - latin1 = FALSE; - internalOrder = !TQChar::networkOrdered(); - networkOrder = FALSE; - } else { - if ( c2 != EOF ) { - dev_ungetch( c2 ); - ungetHack = c1; - } else { - /* - A small bug might hide here. If only the first byte - of a file has made it so far, and that first byte - is half of the byte-order mark, then the utfness - will not be detected. - */ - dev_ungetch( c1 ); - } - } - } - -#ifndef TQT_NO_TEXTCODEC - if ( mapper ) { - bool shortRead = FALSE; - if ( !d->decoder ) - d->decoder = mapper->makeDecoder(); - while( rnum < len ) { - TQString s; - bool readBlock = !( len == 1+rnum ); - for (;;) { - // for efficiency: normally read a whole block - if ( readBlock ) { - // guess buffersize; this may be wrong (too small or too - // big). But we can handle this (either iterate reading - // or use ungetcBuf). - // Note that this might cause problems for codecs where - // one byte can result in >1 Unicode Characters if bytes - // are written to the stream in the meantime (loss of - // synchronicity). - uint rlen = len - rnum; - char *cbuf = new char[ rlen ]; - if ( ungetHack != EOF ) { - rlen = 1+dev->readBlock( cbuf+1, rlen-1 ); - cbuf[0] = (char)ungetHack; - ungetHack = EOF; - } else { - rlen = dev->readBlock( cbuf, rlen ); - } - s += d->decoder->toUnicode( cbuf, rlen ); - delete[] cbuf; - // use buffered reading only for the first time, because we - // have to get the stream synchronous again (this is easier - // with single character reading) - readBlock = FALSE; - } - // get stream (and codec) in sync - int c; - if ( ungetHack == EOF ) { - c = dev_getch(); - } else { - c = ungetHack; - ungetHack = EOF; - } - if ( c == EOF ) { - shortRead = TRUE; - break; - } - char b = c; - uint lengthBefore = s.length(); - s += d->decoder->toUnicode( &b, 1 ); - if ( s.length() > lengthBefore ) - break; // it seems we are in sync now - } - uint i = 0; - uint end = TQMIN( len-rnum, s.length() ); - while( i < end ) { - *buf = s.constref(i++); - buf++; - } - rnum += end; - if ( s.length() > i ) { - // could be = but append is clearer - d->ungetcBuf.append( s.mid( i ) ); - } - if ( shortRead ) - return rnum; - } - } else -#endif - if ( latin1 ) { - if ( len == 1+rnum ) { - // use this method for one character because it is more efficient - // (arnt doubts whether it makes a difference, but lets it stand) - int c = (ungetHack == EOF) ? dev_getch() : ungetHack; - if ( c != EOF ) { - *buf = (char)c; - buf++; - rnum++; - } - } else { - if ( ungetHack != EOF ) { - *buf = (char)ungetHack; - buf++; - rnum++; - ungetHack = EOF; - } - char *cbuf = new char[len - rnum]; - while ( !dev->atEnd() && rnum < len ) { - uint rlen = len - rnum; - rlen = dev->readBlock( cbuf, rlen ); - char *it = cbuf; - char *end = cbuf + rlen; - while ( it < end ) { - *buf = *it; - buf++; - it++; - } - rnum += rlen; - } - delete[] cbuf; - } - } else { // UCS-2 or UTF-16 - if ( len == 1+rnum ) { - int c1 = (ungetHack == EOF) ? dev_getch() : ungetHack; - if ( c1 == EOF ) - return rnum; - int c2 = dev_getch(); - if ( c2 == EOF ) - return rnum; - - if ( networkOrder ) { - *buf = TQChar( c2, c1 ); - } else { - *buf = TQChar( c1, c2 ); - } - buf++; - rnum++; - } else { - char *cbuf = new char[ 2*( len - rnum ) ]; // for paranoids: overflow possible - while ( !dev->atEnd() && rnum < len ) { - uint rlen = 2 * ( len-rnum ); - if ( ungetHack != EOF ) { - rlen = 1+dev->readBlock( cbuf+1, rlen-1 ); - cbuf[0] = (char)ungetHack; - ungetHack = EOF; - } else { - rlen = dev->readBlock( cbuf, rlen ); - } - // We can't use an odd number of bytes, so put it back. But - // do it only if we are capable of reading more -- normally - // there should not be an odd number, but the file might be - // truncated or not in UTF-16... - if ( (rlen & 1) == 1 ) - if ( !dev->atEnd() ) - dev_ungetch( cbuf[--rlen] ); - uint i = 0; - if ( networkOrder ) { - while( i < rlen ) { - *buf = TQChar( cbuf[i+1], cbuf[i] ); - buf++; - i+=2; - } - } else { - while( i < rlen ) { - *buf = TQChar( cbuf[i], cbuf[i+1] ); - buf++; - i+=2; - } - } - rnum += i/2; - } - delete[] cbuf; - } - } - return rnum; -} - -/*! - Tries to read one line, but at most len characters from the stream - and stores them in \a buf. - - Returns the number of characters really read. Newlines are not - stripped. - - There will be a TQEOF appended if the read reaches the end of file; - this is different to ts_getbuf(). - - This function works only if a newline (as byte) is also a newline - (as resulting character) since it uses TQIODevice::readLine(). So - use it only for such codecs where this is true! - - This function is (almost) a no-op for UTF 16. Don't use it if - doUnicodeHeader is TRUE! -*/ -uint TQTextStream::ts_getline( TQChar* buf ) -{ - uint rnum=0; // the number of TQChars really read - char cbuf[ getline_buf_size+1 ]; - - if ( d && d->ungetcBuf.length() ) { - while( rnum < getline_buf_size && rnum < d->ungetcBuf.length() ) { - buf[rnum] = d->ungetcBuf.constref(rnum); - rnum++; - } - d->ungetcBuf = d->ungetcBuf.mid( rnum ); - if ( rnum >= getline_buf_size ) - return rnum; - } - -#ifndef TQT_NO_TEXTCODEC - if ( mapper ) { - if ( !d->decoder ) - d->decoder = mapper->makeDecoder(); - TQString s; - bool readBlock = TRUE; - for (;;) { - // for efficiency: try to read a line - if ( readBlock ) { - int rlen = getline_buf_size - rnum; - rlen = dev->readLine( cbuf, rlen+1 ); - if ( rlen == -1 ) - rlen = 0; - s += d->decoder->toUnicode( cbuf, rlen ); - readBlock = FALSE; - } - if ( dev->atEnd() - || s.at( s.length()-1 ) == '\n' - || s.at( s.length()-1 ) == '\r' - ) { - break; - } else { - // get stream (and codec) in sync - int c; - c = dev_getch(); - if ( c == EOF ) { - break; - } - char b = c; - uint lengthBefore = s.length(); - s += d->decoder->toUnicode( &b, 1 ); - if ( s.length() > lengthBefore ) - break; // it seems we are in sync now - } - } - uint i = 0; - while( rnum < getline_buf_size && i < s.length() ) - buf[rnum++] = s.constref(i++); - if ( s.length() > i ) - // could be = but append is clearer - d->ungetcBuf.append( s.mid( i ) ); - if ( rnum < getline_buf_size && dev->atEnd() ) - buf[rnum++] = TQEOF; - } else -#endif - if ( latin1 ) { - int rlen = getline_buf_size - rnum; - rlen = dev->readLine( cbuf, rlen+1 ); - if ( rlen == -1 ) - rlen = 0; - char *end = cbuf+rlen; - char *it = cbuf; - buf +=rnum; - while ( it != end ) { - buf->setCell( *(it++) ); - buf->setRow( 0 ); - buf++; - } - rnum += rlen; - if ( rnum < getline_buf_size && dev->atEnd() ) - buf[1] = TQEOF; - } - return rnum; -} - - -/*! - Puts one character into the stream. -*/ -void TQTextStream::ts_putc( TQChar c ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( mapper ) { - if ( !d->encoder ) - d->encoder = mapper->makeEncoder(); - int len = 1; - TQString s = c; - TQCString block = d->encoder->fromUnicode( s, len ); - dev->writeBlock( block, len ); - } else -#endif - if ( latin1 ) { - if ( c.row() ) - dev->putch( '?' ); // unknown character - else - dev->putch( c.cell() ); - } else { - if ( doUnicodeHeader ) { - doUnicodeHeader = FALSE; - ts_putc( TQChar::byteOrderMark ); - } - if ( internalOrder ) { - // this case is needed by TQStringBuffer - dev->writeBlock( (char*)&c, sizeof(TQChar) ); - } else if ( networkOrder ) { - dev->putch( c.row() ); - dev->putch( c.cell() ); - } else { - dev->putch( c.cell() ); - dev->putch( c.row() ); - } - } -} - -/*! - Puts one character into the stream. -*/ -void TQTextStream::ts_putc( int ch ) -{ - ts_putc( TQChar((ushort)ch) ); -} - -bool TQTextStream::ts_isdigit( TQChar c ) -{ - return c.isDigit(); -} - -bool TQTextStream::ts_isspace( TQChar c ) -{ - return c.isSpace(); -} - -void TQTextStream::ts_ungetc( TQChar c ) -{ - if ( c.tqunicode() == 0xffff ) - return; - - d->ungetcBuf.prepend( c ); -} - - - -/*! - Reads \a len bytes from the stream into \a s and returns a - reference to the stream. - - The buffer \a s must be preallocated. - - Note that no encoding is done by this function. - - \warning The behavior of this function is undefined unless the - stream's encoding is set to Unicode or Latin1. - - \sa TQIODevice::readBlock() -*/ - -TQTextStream &TQTextStream::readRawBytes( char *s, uint len ) -{ - dev->readBlock( s, len ); - return *this; -} - -/*! - Writes the \a len bytes from \a s to the stream and returns a - reference to the stream. - - Note that no encoding is done by this function. - - \sa TQIODevice::writeBlock() -*/ - -TQTextStream &TQTextStream::writeRawBytes( const char* s, uint len ) -{ - dev->writeBlock( s, len ); - return *this; -} - - -TQTextStream &TQTextStream::writeBlock( const char* p, uint len ) -{ - if ( doUnicodeHeader ) { - doUnicodeHeader = FALSE; - if ( !mapper && !latin1 ) - ts_putc( TQChar::byteOrderMark ); - } - // TQCString and const char * are treated as Latin-1 - if ( !mapper && latin1 ) { - dev->writeBlock( p, len ); - } else if ( !mapper && internalOrder ) { - TQChar *u = new TQChar[len]; - for ( uint i = 0; i < len; i++ ) - u[i] = p[i]; - dev->writeBlock( (char*)u, len * sizeof(TQChar) ); - delete [] u; - } -#ifndef TQT_NO_TEXTCODEC - else if (mapper) { - if (!d->encoder) - d->encoder = mapper->makeEncoder(); - TQString s = TQString::tqfromLatin1(p, len); - int l = len; - TQCString block = d->encoder->fromUnicode(s, l); - dev->writeBlock(block, l); - } -#endif - else { - for ( uint i = 0; i < len; i++ ) - ts_putc( (uchar)p[i] ); - } - return *this; -} - -TQTextStream &TQTextStream::writeBlock( const TQChar* p, uint len ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( mapper ) { - if ( !d->encoder ) - d->encoder = mapper->makeEncoder(); - TQConstString s( p, len ); - int l = len; - TQCString block = d->encoder->fromUnicode( s.string(), l ); - dev->writeBlock( block, l ); - } else -#endif - if ( latin1 ) { - char *str = TQString::tqunicodeToLatin1( p, len ); - dev->writeBlock( str, len ); - delete [] str; - } else if ( internalOrder ) { - if ( doUnicodeHeader ) { - doUnicodeHeader = FALSE; - ts_putc( TQChar::byteOrderMark ); - } - dev->writeBlock( (char*)p, sizeof(TQChar)*len ); - } else { - for (uint i=0; i<len; i++) - ts_putc( p[i] ); - } - return *this; -} - -/*! - Resets the text stream. - - \list - \i All flags are set to 0. - \i The field width is set to 0. - \i The fill character is set to ' ' (Space). - \i The precision is set to 6. - \endlist - - \sa setf(), width(), fill(), precision() -*/ - -void TQTextStream::reset() -{ - fflags = 0; - fwidth = 0; - fillchar = ' '; - fprec = 6; -} - -/*! - \fn TQIODevice *TQTextStream::tqdevice() const - - Returns the IO tqdevice currently set. - - \sa setDevice(), unsetDevice() -*/ - -/*! - Sets the IO tqdevice to \a iod. - - \sa tqdevice(), unsetDevice() -*/ - -void TQTextStream::setDevice( TQIODevice *iod ) -{ - if ( owndev ) { - delete dev; - owndev = FALSE; - } - dev = iod; - d->sourceType = TQTextStreamPrivate::IODevice; -} - -/*! - Unsets the IO tqdevice. Equivalent to setDevice( 0 ). - - \sa tqdevice(), setDevice() -*/ - -void TQTextStream::unsetDevice() -{ - setDevice( 0 ); - d->sourceType = TQTextStreamPrivate::NotSet; -} - -/*! - \fn bool TQTextStream::atEnd() const - - Returns TRUE if the IO tqdevice has reached the end position (end of - the stream or file) or if there is no IO tqdevice set; otherwise - returns FALSE. - - \sa TQIODevice::atEnd() -*/ - -/*!\fn bool TQTextStream::eof() const - - \obsolete - - This function has been renamed to atEnd(). - - \sa TQIODevice::atEnd() -*/ - -/***************************************************************************** - TQTextStream read functions - *****************************************************************************/ - - -/*! - \overload - - Reads a char \a c from the stream and returns a reference to the - stream. Note that whitespace is skipped. -*/ - -TQTextStream &TQTextStream::operator>>( char &c ) -{ - CHECK_STREAM_PRECOND - c = eat_ws(); - return *this; -} - -/*! - Reads a char \a c from the stream and returns a reference to the - stream. Note that whitespace is \e not skipped. -*/ - -TQTextStream &TQTextStream::operator>>( TQChar &c ) -{ - CHECK_STREAM_PRECOND - c = ts_getc(); - return *this; -} - - -ulong TQTextStream::input_bin() -{ - ulong val = 0; - TQChar ch = eat_ws(); - int dv = ch.digitValue(); - while ( dv == 0 || dv == 1 ) { - val = ( val << 1 ) + dv; - ch = ts_getc(); - dv = ch.digitValue(); - } - if ( ch != TQEOF ) - ts_ungetc( ch ); - return val; -} - -ulong TQTextStream::input_oct() -{ - ulong val = 0; - TQChar ch = eat_ws(); - int dv = ch.digitValue(); - while ( dv >= 0 && dv <= 7 ) { - val = ( val << 3 ) + dv; - ch = ts_getc(); - dv = ch.digitValue(); - } - if ( dv == 8 || dv == 9 ) { - while ( ts_isdigit(ch) ) - ch = ts_getc(); - } - if ( ch != TQEOF ) - ts_ungetc( ch ); - return val; -} - -ulong TQTextStream::input_dec() -{ - ulong val = 0; - TQChar ch = eat_ws(); - int dv = ch.digitValue(); - while ( ts_isdigit(ch) ) { - val = val * 10 + dv; - ch = ts_getc(); - dv = ch.digitValue(); - } - if ( ch != TQEOF ) - ts_ungetc( ch ); - return val; -} - -ulong TQTextStream::input_hex() -{ - ulong val = 0; - TQChar ch = eat_ws(); - char c = ch; - while ( isxdigit((uchar) c) ) { - val <<= 4; - if ( ts_isdigit(c) ) - val += c - '0'; - else - val += 10 + tolower( (uchar) c ) - 'a'; - c = ch = ts_getc(); - } - if ( ch != TQEOF ) - ts_ungetc( ch ); - return val; -} - -long TQTextStream::input_int() -{ - long val; - TQChar ch; - char c; - switch ( flags() & basefield ) { - case bin: - val = (long)input_bin(); - break; - case oct: - val = (long)input_oct(); - break; - case dec: - c = ch = eat_ws(); - if ( ch == TQEOF ) { - val = 0; - } else { - if ( !(c == '-' || c == '+') ) - ts_ungetc( ch ); - if ( c == '-' ) { - ulong v = input_dec(); - if ( v ) { // ensure that LONG_MIN can be read - v--; - val = -((long)v) - 1; - } else { - val = 0; - } - } else { - val = (long)input_dec(); - } - } - break; - case hex: - val = (long)input_hex(); - break; - default: - val = 0; - c = ch = eat_ws(); - if ( c == '0' ) { // bin, oct or hex - c = ch = ts_getc(); - if ( tolower((uchar) c) == 'x' ) - val = (long)input_hex(); - else if ( tolower((uchar) c) == 'b' ) - val = (long)input_bin(); - else { // octal - ts_ungetc( ch ); - if ( c >= '0' && c <= '7' ) { - val = (long)input_oct(); - } else { - val = 0; - } - } - } else if ( ts_isdigit(ch) ) { - ts_ungetc( ch ); - val = (long)input_dec(); - } else if ( c == '-' || c == '+' ) { - ulong v = input_dec(); - if ( c == '-' ) { - if ( v ) { // ensure that LONG_MIN can be read - v--; - val = -((long)v) - 1; - } else { - val = 0; - } - } else { - val = (long)v; - } - } - } - return val; -} - -// -// We use a table-driven FSM to parse floating point numbers -// strtod() cannot be used directly since we're reading from a TQIODevice -// - -double TQTextStream::input_double() -{ - const int Init = 0; // states - const int Sign = 1; - const int Mantissa = 2; - const int Dot = 3; - const int Abscissa = 4; - const int ExpMark = 5; - const int ExpSign = 6; - const int Exponent = 7; - const int Done = 8; - - const int InputSign = 1; // input tokens - const int InputDigit = 2; - const int InputDot = 3; - const int InputExp = 4; - - static const uchar table[8][5] = { - /* None InputSign InputDigit InputDot InputExp */ - { 0, Sign, Mantissa, Dot, 0, }, // Init - { 0, 0, Mantissa, Dot, 0, }, // Sign - { Done, Done, Mantissa, Dot, ExpMark,}, // Mantissa - { 0, 0, Abscissa, 0, 0, }, // Dot - { Done, Done, Abscissa, Done, ExpMark,}, // Abscissa - { 0, ExpSign, Exponent, 0, 0, }, // ExpMark - { 0, 0, Exponent, 0, 0, }, // ExpSign - { Done, Done, Exponent, Done, Done } // Exponent - }; - - int state = Init; // parse state - int input; // input token - - char buf[256]; - int i = 0; - TQChar c = eat_ws(); - - for (;;) { - - switch ( c ) { - case '+': - case '-': - input = InputSign; - break; - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - input = InputDigit; - break; - case '.': - input = InputDot; - break; - case 'e': - case 'E': - input = InputExp; - break; - default: - input = 0; - break; - } - - state = table[state][input]; - - if ( state == 0 || state == Done || i > 250 ) { - if ( i > 250 ) { // ignore rest of digits - do { c = ts_getc(); } while ( c != TQEOF && ts_isdigit(c) ); - } - if ( c != TQEOF ) - ts_ungetc( c ); - buf[i] = '\0'; - char *end; - return strtod( buf, &end ); - } - - buf[i++] = c; - c = ts_getc(); - } - -#if !defined(TQ_CC_EDG) - return 0.0; -#endif -} - - -/*! - \overload - - Reads a signed \c short integer \a i from the stream and returns a - reference to the stream. See flags() for an explanation of the - expected input format. -*/ - -TQTextStream &TQTextStream::operator>>( signed short &i ) -{ - CHECK_STREAM_PRECOND - i = (signed short)input_int(); - return *this; -} - - -/*! - \overload - - Reads an unsigned \c short integer \a i from the stream and - returns a reference to the stream. See flags() for an explanation - of the expected input format. -*/ - -TQTextStream &TQTextStream::operator>>( unsigned short &i ) -{ - CHECK_STREAM_PRECOND - i = (unsigned short)input_int(); - return *this; -} - - -/*! - \overload - - Reads a signed \c int \a i from the stream and returns a reference - to the stream. See flags() for an explanation of the expected - input format. -*/ - -TQTextStream &TQTextStream::operator>>( signed int &i ) -{ - CHECK_STREAM_PRECOND - i = (signed int)input_int(); - return *this; -} - - -/*! - \overload - - Reads an unsigned \c int \a i from the stream and returns a - reference to the stream. See flags() for an explanation of the - expected input format. -*/ - -TQTextStream &TQTextStream::operator>>( unsigned int &i ) -{ - CHECK_STREAM_PRECOND - i = (unsigned int)input_int(); - return *this; -} - - -/*! - \overload - - Reads a signed \c long int \a i from the stream and returns a - reference to the stream. See flags() for an explanation of the - expected input format. -*/ - -TQTextStream &TQTextStream::operator>>( signed long &i ) -{ - CHECK_STREAM_PRECOND - i = (signed long)input_int(); - return *this; -} - - -/*! - \overload - - Reads an unsigned \c long int \a i from the stream and returns a - reference to the stream. See flags() for an explanation of the - expected input format. -*/ - -TQTextStream &TQTextStream::operator>>( unsigned long &i ) -{ - CHECK_STREAM_PRECOND - i = (unsigned long)input_int(); - return *this; -} - - -/*! - \overload - - Reads a \c float \a f from the stream and returns a reference to - the stream. See flags() for an explanation of the expected input - format. -*/ - -TQTextStream &TQTextStream::operator>>( float &f ) -{ - CHECK_STREAM_PRECOND - f = (float)input_double(); - return *this; -} - - -/*! - \overload - - Reads a \c double \a f from the stream and returns a reference to - the stream. See flags() for an explanation of the expected input - format. -*/ - -TQTextStream &TQTextStream::operator>>( double &f ) -{ - CHECK_STREAM_PRECOND - f = input_double(); - return *this; -} - - -/*! - \overload - - Reads a "word" from the stream into \a s and returns a reference - to the stream. - - A word consists of characters for which isspace() returns FALSE. -*/ - -TQTextStream &TQTextStream::operator>>( char *s ) -{ - CHECK_STREAM_PRECOND - int maxlen = width( 0 ); - TQChar c = eat_ws(); - if ( !maxlen ) - maxlen = -1; - while ( c != TQEOF ) { - if ( ts_isspace(c) || maxlen-- == 0 ) { - ts_ungetc( c ); - break; - } - *s++ = c; - c = ts_getc(); - } - - *s = '\0'; - return *this; -} - -/*! - \overload - - Reads a "word" from the stream into \a str and returns a reference - to the stream. - - A word consists of characters for which isspace() returns FALSE. -*/ - -TQTextStream &TQTextStream::operator>>( TQString &str ) -{ - CHECK_STREAM_PRECOND - str=TQString::tqfromLatin1(""); - TQChar c = eat_ws(); - - while ( c != TQEOF ) { - if ( ts_isspace(c) ) { - ts_ungetc( c ); - break; - } - str += c; - c = ts_getc(); - } - return *this; -} - -/*! - \overload - - Reads a "word" from the stream into \a str and returns a reference - to the stream. - - A word consists of characters for which isspace() returns FALSE. -*/ - -TQTextStream &TQTextStream::operator>>( TQCString &str ) -{ - CHECK_STREAM_PRECOND - TQCString *dynbuf = 0; - const int buflen = 256; - char buffer[buflen]; - char *s = buffer; - int i = 0; - TQChar c = eat_ws(); - - while ( c != TQEOF ) { - if ( ts_isspace(c) ) { - ts_ungetc( c ); - break; - } - if ( i >= buflen-1 ) { - if ( !dynbuf ) { // create dynamic buffer - dynbuf = new TQCString(buflen*2); - memcpy( dynbuf->data(), s, i ); // copy old data - } else if ( i >= (int)dynbuf->size()-1 ) { - dynbuf->resize( dynbuf->size()*2 ); - } - s = dynbuf->data(); - } - s[i++] = c; - c = ts_getc(); - } - str.resize( i+1 ); - memcpy( str.data(), s, i ); - delete dynbuf; - return *this; -} - - -/*! - Reads a line from the stream and returns a string containing the - text. - - The returned string does not contain any trailing newline or - carriage return. Note that this is different from - TQIODevice::readLine(), which does not strip the newline at the end - of the line. - - On EOF you will get a TQString that is null. On reading an empty - line the returned TQString is empty but not null. - - \sa TQIODevice::readLine() -*/ - -TQString TQTextStream::readLine() -{ -#if defined(TQT_CHECK_STATE) - if ( !dev ) { - qWarning( "TQTextStream::readLine: No tqdevice" ); - return TQString::null; - } -#endif - bool readCharByChar = TRUE; - TQString result; -#if 0 - if ( !doUnicodeHeader && ( - (latin1) || - (mapper != 0 && mapper->mibEnum() == 106 ) // UTF 8 - ) ) { - readCharByChar = FALSE; - // use optimized read line - TQChar c[getline_buf_size]; - int pos = 0; - bool eof = FALSE; - - for (;;) { - pos = ts_getline( c ); - if ( pos == 0 ) { - // something went wrong; try fallback - readCharByChar = TRUE; - //dev->resetqStatus(); - break; - } - if ( c[pos-1] == TQEOF || c[pos-1] == '\n' ) { - if ( pos>2 && c[pos-1]==TQEOF && c[pos-2]=='\n' ) { - result += TQString( c, pos-2 ); - } else if ( pos > 1 ) { - result += TQString( c, pos-1 ); - } - if ( pos == 1 && c[pos-1] == TQEOF ) - eof = TRUE; - break; - } else { - result += TQString( c, pos ); - } - } - if ( eof && result.isEmpty() ) - return TQString::null; - } -#endif - if ( readCharByChar ) { - const int buf_size = 256; - TQChar c[buf_size]; - int pos = 0; - - c[pos] = ts_getc(); - if ( c[pos] == TQEOF ) - return TQString::null; - - while ( c[pos] != TQEOF && c[pos] != '\n' ) { - if ( c[pos] == '\r' ) { // ( handle mac and dos ) - TQChar nextc = ts_getc(); - if ( nextc != '\n' ) - ts_ungetc( nextc ); - break; - } - pos++; - if ( pos >= buf_size ) { - result += TQString( c, pos ); - pos = 0; - } - c[pos] = ts_getc(); - } - result += TQString( c, pos ); - } - - return result; -} - - -/*! - Reads the entire stream from the current position, and returns a string - containing the text. - - \sa TQIODevice::readLine() -*/ - -TQString TQTextStream::read() -{ -#if defined(TQT_CHECK_STATE) - if ( !dev ) { - qWarning( "TQTextStream::read: No tqdevice" ); - return TQString::null; - } -#endif - TQString result; - const uint bufsize = 512; - TQChar buf[bufsize]; - uint i, num, start; - bool skipped_cr = FALSE; - - for (;;) { - num = ts_getbuf(buf,bufsize); - // convert dos (\r\n) and mac (\r) style eol to unix style (\n) - start = 0; - for ( i=0; i<num; i++ ) { - if ( buf[i] == '\r' ) { - // Only skip single cr's preceding lf's - if ( skipped_cr ) { - result += buf[i]; - start++; - } else { - result += TQString( &buf[start], i-start ); - start = i+1; - skipped_cr = TRUE; - } - } else { - if ( skipped_cr ) { - if ( buf[i] != '\n' ) { - // Should not have skipped it - result += '\n'; - } - skipped_cr = FALSE; - } - } - } - if ( start < num ) - result += TQString( &buf[start], i-start ); - if ( num != bufsize ) // if ( EOF ) - break; - } - return result; -} - - - -/***************************************************************************** - TQTextStream write functions - *****************************************************************************/ - -/*! - Writes character \c char to the stream and returns a reference to - the stream. - - The character \a c is assumed to be Latin1 encoded independent of - the Encoding set for the TQTextStream. -*/ -TQTextStream &TQTextStream::operator<<( TQChar c ) -{ - CHECK_STREAM_PRECOND - ts_putc( c ); - return *this; -} - -/*! - \overload - - Writes character \a c to the stream and returns a reference to the - stream. -*/ -TQTextStream &TQTextStream::operator<<( char c ) -{ - CHECK_STREAM_PRECOND - unsigned char uc = (unsigned char) c; - ts_putc( uc ); - return *this; -} - -TQTextStream &TQTextStream::output_int( int format, ulong n, bool neg ) -{ - static const char hexdigits_lower[] = "0123456789abcdef"; - static const char hexdigits_upper[] = "0123456789ABCDEF"; - CHECK_STREAM_PRECOND - char buf[76]; - register char *p; - int len; - const char *hexdigits; - - switch ( flags() & I_BASE_MASK ) { - - case I_BASE_2: // output binary number - switch ( format & I_TYPE_MASK ) { - case I_SHORT: len=16; break; - case I_INT: len=sizeof(int)*8; break; - case I_LONG: len=32; break; - default: len = 0; - } - p = &buf[74]; // go reverse order - *p = '\0'; - while ( len-- ) { - *--p = (char)(n&1) + '0'; - n >>= 1; - if ( !n ) - break; - } - if ( flags() & showbase ) { // show base - *--p = (flags() & uppercase) ? 'B' : 'b'; - *--p = '0'; - } - break; - - case I_BASE_8: // output octal number - p = &buf[74]; - *p = '\0'; - do { - *--p = (char)(n&7) + '0'; - n >>= 3; - } while ( n ); - if ( flags() & showbase ) - *--p = '0'; - break; - - case I_BASE_16: // output hexadecimal number - p = &buf[74]; - *p = '\0'; - hexdigits = (flags() & uppercase) ? - hexdigits_upper : hexdigits_lower; - do { - *--p = hexdigits[(int)n&0xf]; - n >>= 4; - } while ( n ); - if ( flags() & showbase ) { - *--p = (flags() & uppercase) ? 'X' : 'x'; - *--p = '0'; - } - break; - - default: // decimal base is default - p = &buf[74]; - *p = '\0'; - if ( neg ) - n = (ulong)(-(long)n); - do { - *--p = ((int)(n%10)) + '0'; - n /= 10; - } while ( n ); - if ( neg ) - *--p = '-'; - else if ( flags() & showpos ) - *--p = '+'; - if ( (flags() & internal) && fwidth && !ts_isdigit(*p) ) { - ts_putc( *p ); // special case for internal - ++p; // padding - fwidth--; - return *this << (const char*)p; - } - } - if ( fwidth ) { // adjustment required - if ( !(flags() & left) ) { // but NOT left adjustment - len = tqstrlen(p); - int padlen = fwidth - len; - if ( padlen <= 0 ) { // no padding required - writeBlock( p, len ); - } else if ( padlen < (int)(p-buf) ) { // speeds up padding - memset( p-padlen, (char)fillchar, padlen ); - writeBlock( p-padlen, padlen+len ); - } - else // standard padding - *this << (const char*)p; - } - else - *this << (const char*)p; - fwidth = 0; // reset field width - } - else - writeBlock( p, tqstrlen(p) ); - return *this; -} - - -/*! - \overload - - Writes a \c short integer \a i to the stream and returns a - reference to the stream. -*/ - -TQTextStream &TQTextStream::operator<<( signed short i ) -{ - return output_int( I_SHORT | I_SIGNED, i, i < 0 ); -} - - -/*! - \overload - - Writes an \c unsigned \c short integer \a i to the stream and - returns a reference to the stream. -*/ - -TQTextStream &TQTextStream::operator<<( unsigned short i ) -{ - return output_int( I_SHORT | I_UNSIGNED, i, FALSE ); -} - - -/*! - \overload - - Writes an \c int \a i to the stream and returns a reference to the - stream. -*/ - -TQTextStream &TQTextStream::operator<<( signed int i ) -{ - return output_int( I_INT | I_SIGNED, i, i < 0 ); -} - - -/*! - \overload - - Writes an \c unsigned \c int \a i to the stream and returns a - reference to the stream. -*/ - -TQTextStream &TQTextStream::operator<<( unsigned int i ) -{ - return output_int( I_INT | I_UNSIGNED, i, FALSE ); -} - - -/*! - \overload - - Writes a \c long \c int \a i to the stream and returns a reference - to the stream. -*/ - -TQTextStream &TQTextStream::operator<<( signed long i ) -{ - return output_int( I_LONG | I_SIGNED, i, i < 0 ); -} - - -/*! - \overload - - Writes an \c unsigned \c long \c int \a i to the stream and - returns a reference to the stream. -*/ - -TQTextStream &TQTextStream::operator<<( unsigned long i ) -{ - return output_int( I_LONG | I_UNSIGNED, i, FALSE ); -} - - -/*! - \overload - - Writes a \c float \a f to the stream and returns a reference to - the stream. -*/ - -TQTextStream &TQTextStream::operator<<( float f ) -{ - return *this << (double)f; -} - -/*! - \overload - - Writes a \c double \a f to the stream and returns a reference to - the stream. -*/ - -TQTextStream &TQTextStream::operator<<( double f ) -{ - CHECK_STREAM_PRECOND - char f_char; - char format[16]; - if ( (flags()&floatfield) == fixed ) - f_char = 'f'; - else if ( (flags()&floatfield) == scientific ) - f_char = (flags() & uppercase) ? 'E' : 'e'; - else - f_char = (flags() & uppercase) ? 'G' : 'g'; - register char *fs = format; // generate format string - *fs++ = '%'; // "%.<prec>l<f_char>" - *fs++ = '.'; - int prec = precision(); - if ( prec > 99 ) - prec = 99; - if ( prec >= 10 ) { - *fs++ = prec / 10 + '0'; - *fs++ = prec % 10 + '0'; - } else { - *fs++ = prec + '0'; - } - *fs++ = 'l'; - *fs++ = f_char; - *fs = '\0'; - TQString num; - num.sprintf(format, f); // convert to text - if ( fwidth ) // padding - *this << num.latin1(); - else // just write it - writeBlock(num.latin1(), num.length()); - return *this; -} - - -/*! - \overload - - Writes a string to the stream and returns a reference to the - stream. - - The string \a s is assumed to be Latin1 encoded independent of the - Encoding set for the TQTextStream. -*/ - -TQTextStream &TQTextStream::operator<<( const char* s ) -{ - CHECK_STREAM_PRECOND - char padbuf[48]; - uint len = tqstrlen( s ); // don't write null terminator - if ( fwidth ) { // field width set - int padlen = fwidth - len; - fwidth = 0; // reset width - if ( padlen > 0 ) { - char *ppad; - if ( padlen > 46 ) { // create extra big fill buffer - ppad = new char[padlen]; - TQ_CHECK_PTR( ppad ); - } else { - ppad = padbuf; - } - memset( ppad, (char)fillchar, padlen ); // fill with fillchar - if ( !(flags() & left) ) { - writeBlock( ppad, padlen ); - padlen = 0; - } - writeBlock( s, len ); - if ( padlen ) - writeBlock( ppad, padlen ); - if ( ppad != padbuf ) // delete extra big fill buf - delete[] ppad; - return *this; - } - } - writeBlock( s, len ); - return *this; -} - -/*! - \overload - - Writes \a s to the stream and returns a reference to the stream. - - The string \a s is assumed to be Latin1 encoded independent of the - Encoding set for the TQTextStream. -*/ - -TQTextStream &TQTextStream::operator<<( const TQCString & s ) -{ - return operator<<(s.data()); -} - -/*! - \overload - - Writes \a s to the stream and returns a reference to the stream. -*/ - -TQTextStream &TQTextStream::operator<<( const TQString& s ) -{ - if ( !mapper && latin1 ) - return operator<<(s.latin1()); - CHECK_STREAM_PRECOND - TQString s1 = s; - if ( fwidth ) { // field width set - if ( !(flags() & left) ) { - s1 = s.rightJustify(fwidth, (char)fillchar); - } else { - s1 = s.leftJustify(fwidth, (char)fillchar); - } - fwidth = 0; // reset width - } - writeBlock( s1.tqunicode(), s1.length() ); - return *this; -} - - -/*! - \overload - - Writes a pointer to the stream and returns a reference to the - stream. - - The \a ptr is output as an unsigned long hexadecimal integer. -*/ - -TQTextStream &TQTextStream::operator<<( void *ptr ) -{ - int f = flags(); - setf( hex, basefield ); - setf( showbase ); - unsetf( uppercase ); - output_int( I_LONG | I_UNSIGNED, (ulong)ptr, FALSE ); - flags( f ); - return *this; -} - - -/*! - \fn int TQTextStream::flags() const - - Returns the current stream flags. The default value is 0. - - \table - \header \i Flag \i Meaning - \row \i \c skipws \i Not currently used; whitespace always skipped - \row \i \c left \i Numeric fields are left-aligned - \row \i \c right - \i Not currently used (by default, numerics are right-aligned) - \row \i \c internal \i Puts any padding spaces between +/- and value - \row \i \c bin \i Output \e and input only in binary - \row \i \c oct \i Output \e and input only in octal - \row \i \c dec \i Output \e and input only in decimal - \row \i \c hex \i Output \e and input only in hexadecimal - \row \i \c showbase - \i Annotates numeric outputs with 0b, 0, or 0x if in \c bin, - \c oct, or \c hex format - \row \i \c showpoint \i Not currently used - \row \i \c uppercase \i Uses 0B and 0X rather than 0b and 0x - \row \i \c showpos \i Shows + for positive numeric values - \row \i \c scientific \i Uses scientific notation for floating point values - \row \i \c fixed \i Uses fixed-point notation for floating point values - \endtable - - Note that unless \c bin, \c oct, \c dec, or \c hex is set, the - input base is octal if the value starts with 0, hexadecimal if it - starts with 0x, binary if it starts with 0b, and decimal - otherwise. - - \sa setf(), unsetf() -*/ - -/*! - \fn int TQTextStream::flags( int f ) - - \overload - - Sets the stream flags to \a f. Returns the previous stream flags. - - \sa setf(), unsetf(), flags() -*/ - -/*! - \fn int TQTextStream::setf( int bits ) - - Sets the stream flag bits \a bits. Returns the previous stream - flags. - - Equivalent to \c{flags( flags() | bits )}. - - \sa setf(), unsetf() -*/ - -/*! - \fn int TQTextStream::setf( int bits, int mask ) - - \overload - - Sets the stream flag bits \a bits with a bit mask \a mask. Returns - the previous stream flags. - - Equivalent to \c{flags( (flags() & ~mask) | (bits & mask) )}. - - \sa setf(), unsetf() -*/ - -/*! - \fn int TQTextStream::unsetf( int bits ) - - Clears the stream flag bits \a bits. Returns the previous stream - flags. - - Equivalent to \c{flags( flags() & ~mask )}. - - \sa setf() -*/ - -/*! - \fn int TQTextStream::width() const - - Returns the field width. The default value is 0. -*/ - -/*! - \fn int TQTextStream::width( int w ) - - \overload - - Sets the field width to \a w. Returns the previous field width. -*/ - -/*! - \fn int TQTextStream::fill() const - - Returns the fill character. The default value is ' ' (space). -*/ - -/*! - \overload int TQTextStream::fill( int f ) - - Sets the fill character to \a f. Returns the previous fill character. -*/ - -/*! - \fn int TQTextStream::precision() const - - Returns the precision. The default value is 6. -*/ - -/*! - \fn int TQTextStream::precision( int p ) - - \overload - - Sets the precision to \a p. Returns the previous precision setting. -*/ - - - /***************************************************************************** - TQTextStream manipulators - *****************************************************************************/ - -TQTextStream &bin( TQTextStream &s ) -{ - s.setf(TQTS::bin,TQTS::basefield); - return s; -} - -TQTextStream &oct( TQTextStream &s ) -{ - s.setf(TQTS::oct,TQTS::basefield); - return s; -} - -TQTextStream &dec( TQTextStream &s ) -{ - s.setf(TQTS::dec,TQTS::basefield); - return s; -} - -TQTextStream &hex( TQTextStream &s ) -{ - s.setf(TQTS::hex,TQTS::basefield); - return s; -} - -TQTextStream &endl( TQTextStream &s ) -{ - return s << '\n'; -} - -TQTextStream &flush( TQTextStream &s ) -{ - if ( s.tqdevice() ) - s.tqdevice()->flush(); - return s; -} - -TQTextStream &ws( TQTextStream &s ) -{ - s.skipWhiteSpace(); - return s; -} - -TQTextStream &reset( TQTextStream &s ) -{ - s.reset(); - return s; -} - - -/*! - \class TQTextIStream tqtextstream.h - \reentrant - \brief The TQTextIStream class is a convenience class for input streams. - - \ingroup io - \ingroup text - - This class provides a shorthand for creating simple input - \l{TQTextStream}s without having to pass a \e mode argument to the - constructor. - - This class makes it easy, for example, to write things like this: - \code - TQString data = "123 456"; - int a, b; - TQTextIStream(&data) >> a >> b; - \endcode - - \sa TQTextOStream -*/ - -/*! - \fn TQTextIStream::TQTextIStream( const TQString *s ) - - Constructs a stream to read from the string \a s. -*/ -/*! - \fn TQTextIStream::TQTextIStream( TQByteArray ba ) - - Constructs a stream to read from the array \a ba. -*/ -/*! - \fn TQTextIStream::TQTextIStream( FILE *f ) - - Constructs a stream to read from the file \a f. -*/ - - -/*! - \class TQTextOStream - \reentrant - \brief The TQTextOStream class is a convenience class for output streams. - - \ingroup io - \ingroup text - - This class provides a shorthand for creating simple output - \l{TQTextStream}s without having to pass a \e mode argument to the - constructor. - - This makes it easy for example, to write things like this: - \code - TQString result; - TQTextOStream(&result) << "pi = " << 3.14; - \endcode -*/ - -/*! - \fn TQTextOStream::TQTextOStream( TQString *s ) - - Constructs a stream to write to string \a s. -*/ -/*! - \fn TQTextOStream::TQTextOStream( TQByteArray ba ) - - Constructs a stream to write to the array \a ba. -*/ -/*! - \fn TQTextOStream::TQTextOStream( FILE *f ) - - Constructs a stream to write to the file \a f. -*/ - - - -/*! - Sets the encoding of this stream to \a e, where \a e is one of the - following values: - \table - \header \i Encoding \i Meaning - \row \i Locale - \i Uses local file format (Latin1 if locale is not set), but - autodetecting Unicode(utf16) on input. - \row \i Unicode - \i Uses Unicode(utf16) for input and output. Output will be - written in the order most efficient for the current platform - (i.e. the order used internally in TQString). - \row \i UnicodeUTF8 - \i Using Unicode(utf8) for input and output. If you use it for - input it will autodetect utf16 and use it instead of utf8. - \row \i Latin1 - \i ISO-8859-1. Will not autodetect utf16. - \row \i UnicodeNetworkOrder - \i Uses network order Unicode(utf16) for input and output. - Useful when reading Unicode data that does not start with the - byte order marker. - \row \i UnicodeReverse - \i Uses reverse network order Unicode(utf16) for input and - output. Useful when reading Unicode data that does not start - with the byte order marker or when writing data that should be - read by buggy Windows applications. - \row \i RawUnicode - \i Like Unicode, but does not write the byte order marker nor - does it auto-detect the byte order. Useful only when writing to - non-persistent storage used by a single process. - \endtable - - \c Locale and all Unicode encodings, except \c RawUnicode, will look - at the first two bytes in an input stream to determine the byte - order. The initial byte order marker will be stripped off before - data is read. - - Note that this function should be called before any data is read to - or written from the stream. - - \sa setCodec() -*/ - -void TQTextStream::setEncoding( Encoding e ) -{ - if ( d->sourceType == TQTextStreamPrivate::String ) - return; - - switch ( e ) { - case Unicode: - mapper = 0; - latin1 = FALSE; - doUnicodeHeader = TRUE; - internalOrder = TRUE; - networkOrder = TQChar::networkOrdered(); - break; - case UnicodeUTF8: -#ifndef TQT_NO_TEXTCODEC - mapper = TQTextCodec::codecForMib( 106 ); - latin1 = FALSE; - doUnicodeHeader = TRUE; - internalOrder = TRUE; - networkOrder = TQChar::networkOrdered(); -#else - mapper = 0; - latin1 = TRUE; - doUnicodeHeader = TRUE; -#endif - break; - case UnicodeNetworkOrder: - mapper = 0; - latin1 = FALSE; - doUnicodeHeader = TRUE; - internalOrder = TQChar::networkOrdered(); - networkOrder = TRUE; - break; - case UnicodeReverse: - mapper = 0; - latin1 = FALSE; - doUnicodeHeader = TRUE; - internalOrder = !TQChar::networkOrdered(); - networkOrder = FALSE; - break; - case RawUnicode: - mapper = 0; - latin1 = FALSE; - doUnicodeHeader = FALSE; - internalOrder = TRUE; - networkOrder = TQChar::networkOrdered(); - break; - case Locale: - latin1 = TRUE; // fallback to Latin-1 -#ifndef TQT_NO_TEXTCODEC - mapper = TQTextCodec::codecForLocale(); - // optimized Latin-1 processing -#if defined(TQ_OS_WIN32) - if ( GetACP() == 1252 ) - mapper = 0; -#endif - if ( mapper && mapper->mibEnum() == 4 ) -#endif - mapper = 0; - - doUnicodeHeader = TRUE; // If it reads as Unicode, accept it - break; - case Latin1: - mapper = 0; - doUnicodeHeader = FALSE; - latin1 = TRUE; - break; - } -} - - -#ifndef TQT_NO_TEXTCODEC -/*! - Sets the codec for this stream to \a codec. Will not try to - autodetect Unicode. - - Note that this function should be called before any data is read - to/written from the stream. - - \sa setEncoding(), codec() -*/ - -void TQTextStream::setCodec( TQTextCodec *codec ) -{ - if ( d->sourceType == TQTextStreamPrivate::String ) - return; // TQString does not need any codec - mapper = codec; - latin1 = ( codec->mibEnum() == 4 ); - if ( latin1 ) - mapper = 0; - doUnicodeHeader = FALSE; -} - -/*! - Returns the codec actually used for this stream. - - If Unicode is automatically detected in input, a codec with \link - TQTextCodec::name() name() \endlink "ISO-10646-UCS-2" is returned. - - \sa setCodec() -*/ - -TQTextCodec *TQTextStream::codec() -{ - if ( mapper ) { - return mapper; - } else { - // 4 is "ISO 8859-1", 1000 is "ISO-10646-UCS-2" - return TQTextCodec::codecForMib( latin1 ? 4 : 1000 ); - } -} - -#endif - -#endif // TQT_NO_TEXTSTREAM diff --git a/tqtinterface/qt4/src/tools/tqtextstream.h b/tqtinterface/qt4/src/tools/tqtextstream.h deleted file mode 100644 index 684687b..0000000 --- a/tqtinterface/qt4/src/tools/tqtextstream.h +++ /dev/null @@ -1,343 +0,0 @@ -/**************************************************************************** -** -** Definition of TQTextStream class -** -** Created : 940922 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQTEXTSTREAM_H -#define TQTEXTSTREAM_H - -#ifndef TQT_H -#include "tqiodevice.h" -#include "tqfile.h" -#include "tqstring.h" -#include <stdio.h> -#endif // TQT_H - -#ifndef TQT_NO_TEXTSTREAM -class TQTextCodec; -class TQTextDecoder; - -class TQTextStreamPrivate; - -class TQ_EXPORT TQTextStream // text stream class -{ -public: - enum Encoding { Locale, Latin1, Unicode, UnicodeNetworkOrder, - UnicodeReverse, RawUnicode, UnicodeUTF8 }; - - void setEncoding( Encoding ); -#ifndef TQT_NO_TEXTCODEC - void setCodec( TQTextCodec* ); - TQTextCodec *codec(); -#endif - - TQTextStream(); - TQTextStream( QIODevice * ); - TQTextStream( QFile *tqf ); - TQTextStream( TQString*, int mode ); - TQTextStream( TQString&, int mode ); // obsolete - TQTextStream( TQByteArray, int mode ); - TQTextStream( FILE *, int mode ); - virtual ~TQTextStream(); - - TQIODevice *tqdevice() const; - void setDevice( TQIODevice * ); - void unsetDevice(); - - bool atEnd() const; - bool eof() const; - - TQTextStream &operator>>( TQChar & ); - TQTextStream &operator>>( char & ); - TQTextStream &operator>>( signed short & ); - TQTextStream &operator>>( unsigned short & ); - TQTextStream &operator>>( signed int & ); - TQTextStream &operator>>( unsigned int & ); - TQTextStream &operator>>( signed long & ); - TQTextStream &operator>>( unsigned long & ); - TQTextStream &operator>>( float & ); - TQTextStream &operator>>( double & ); - TQTextStream &operator>>( char * ); - TQTextStream &operator>>( TQString & ); - TQTextStream &operator>>( TQCString & ); - - TQTextStream &operator<<( TQChar ); - TQTextStream &operator<<( char ); - TQTextStream &operator<<( signed short ); - TQTextStream &operator<<( unsigned short ); - TQTextStream &operator<<( signed int ); - TQTextStream &operator<<( unsigned int ); - TQTextStream &operator<<( signed long ); - TQTextStream &operator<<( unsigned long ); - TQTextStream &operator<<( float ); - TQTextStream &operator<<( double ); - TQTextStream &operator<<( const char* ); - TQTextStream &operator<<( const TQString & ); - TQTextStream &operator<<( const TQCString & ); - TQTextStream &operator<<( void * ); // any pointer - - TQTextStream &readRawBytes( char *, uint len ); - TQTextStream &writeRawBytes( const char* , uint len ); - - TQString readLine(); - TQString read(); - void skipWhiteSpace(); - - enum { - skipws = 0x0001, // skip whitespace on input - left = 0x0002, // left-adjust output - right = 0x0004, // right-adjust output - internal = 0x0008, // pad after sign - bin = 0x0010, // binary format integer - oct = 0x0020, // octal format integer - dec = 0x0040, // decimal format integer - hex = 0x0080, // hex format integer - showbase = 0x0100, // show base indicator - showpoint = 0x0200, // force decimal point (float) - uppercase = 0x0400, // upper-case hex output - showpos = 0x0800, // add '+' to positive integers - scientific= 0x1000, // scientific float output - fixed = 0x2000 // fixed float output - }; - - static const int basefield; // bin | oct | dec | hex - static const int adjustfield; // left | right | internal - static const int floatfield; // scientific | fixed - - int flags() const; - int flags( int f ); - int setf( int bits ); - int setf( int bits, int mask ); - int unsetf( int bits ); - - void reset(); - - int width() const; - int width( int ); - int fill() const; - int fill( int ); - int precision() const; - int precision( int ); - -private: - long input_int(); - void init(); - TQTextStream &output_int( int, ulong, bool ); - TQIODevice *dev; - - int fflags; - int fwidth; - int fillchar; - int fprec; - bool doUnicodeHeader; - bool owndev; - TQTextCodec *mapper; - TQTextStreamPrivate * d; - TQChar unused1; // ### remove in TQt 4.0 - bool latin1; - bool internalOrder; - bool networkOrder; - void *unused2; // ### remove in TQt 4.0 - - TQChar eat_ws(); - uint ts_getline( TQChar* ); - void ts_ungetc( TQChar ); - TQChar ts_getc(); - uint ts_getbuf( TQChar*, uint ); - void ts_putc(int); - void ts_putc(TQChar); - bool ts_isspace(TQChar); - bool ts_isdigit(TQChar); - ulong input_bin(); - ulong input_oct(); - ulong input_dec(); - ulong input_hex(); - double input_double(); - TQTextStream &writeBlock( const char* p, uint len ); - TQTextStream &writeBlock( const TQChar* p, uint len ); - - int dev_getch(); - int dev_ungetch(int ch); - -private: // Disabled copy constructor and operator= -#if defined(TQ_DISABLE_COPY) - TQTextStream( const TQTextStream & ); - TQTextStream &operator=( const TQTextStream & ); -#endif -}; - -typedef TQTextStream TQTS; - -class TQ_EXPORT TQTextIStream : public TQTextStream { -public: - TQTextIStream( const TQString* s ) : - TQTextStream((TQString*)s,IO_ReadOnly) { } - TQTextIStream( TQByteArray ba ) : - TQTextStream(ba,IO_ReadOnly) { } - TQTextIStream( FILE *f ) : - TQTextStream(f,IO_ReadOnly) { } - -private: // Disabled copy constructor and operator= -#if defined(TQ_DISABLE_COPY) - TQTextIStream( const TQTextIStream & ); - TQTextIStream &operator=( const TQTextIStream & ); -#endif -}; - -class TQ_EXPORT TQTextOStream : public TQTextStream { -public: - TQTextOStream( TQString* s ) : - TQTextStream(s,IO_WriteOnly) { } - TQTextOStream( TQByteArray ba ) : - TQTextStream(ba,IO_WriteOnly) { } - TQTextOStream( FILE *f ) : - TQTextStream(f,IO_WriteOnly) { } - -private: // Disabled copy constructor and operator= -#if defined(TQ_DISABLE_COPY) - TQTextOStream( const TQTextOStream & ); - TQTextOStream &operator=( const TQTextOStream & ); -#endif -}; - -/***************************************************************************** - TQTextStream inline functions - *****************************************************************************/ - -inline TQIODevice *TQTextStream::tqdevice() const -{ return dev; } - -inline bool TQTextStream::atEnd() const -{ return dev ? dev->atEnd() : FALSE; } - -inline bool TQTextStream::eof() const -{ return atEnd(); } - -inline int TQTextStream::flags() const -{ return fflags; } - -inline int TQTextStream::flags( int f ) -{ int oldf = fflags; fflags = f; return oldf; } - -inline int TQTextStream::setf( int bits ) -{ int oldf = fflags; fflags |= bits; return oldf; } - -inline int TQTextStream::setf( int bits, int mask ) -{ int oldf = fflags; fflags = (fflags & ~mask) | (bits & mask); return oldf; } - -inline int TQTextStream::unsetf( int bits ) -{ int oldf = fflags; fflags &= ~bits; return oldf; } - -inline int TQTextStream::width() const -{ return fwidth; } - -inline int TQTextStream::width( int w ) -{ int oldw = fwidth; fwidth = w; return oldw; } - -inline int TQTextStream::fill() const -{ return fillchar; } - -inline int TQTextStream::fill( int f ) -{ int oldc = fillchar; fillchar = f; return oldc; } - -inline int TQTextStream::precision() const -{ return fprec; } - -inline int TQTextStream::precision( int p ) -{ int oldp = fprec; fprec = p; return oldp; } - -/*! - Returns one character from the stream, or EOF. -*/ -inline TQChar TQTextStream::ts_getc() -{ TQChar r; return ( ts_getbuf( &r,1 ) == 1 ? r : TQChar((ushort)0xffff) ); } - -/***************************************************************************** - TQTextStream manipulators - *****************************************************************************/ - -typedef TQTextStream & (*TQTSFUNC)(TQTextStream &);// manipulator function -typedef int (TQTextStream::*TQTSMFI)(int); // manipulator w/int argument - -class TQ_EXPORT TQTSManip { // text stream manipulator -public: - TQTSManip( TQTSMFI m, int a ) { mf=m; arg=a; } - void exec( TQTextStream &s ) { (s.*mf)(arg); } -private: - TQTSMFI mf; // TQTextStream member function - int arg; // member function argument -}; - -TQ_EXPORT inline TQTextStream &operator>>( TQTextStream &s, TQTSFUNC f ) -{ return (*f)( s ); } - -TQ_EXPORT inline TQTextStream &operator<<( TQTextStream &s, TQTSFUNC f ) -{ return (*f)( s ); } - -TQ_EXPORT inline TQTextStream &operator<<( TQTextStream &s, TQTSManip m ) -{ m.exec(s); return s; } - -TQ_EXPORT TQTextStream &bin( TQTextStream &s ); // set bin notation -TQ_EXPORT TQTextStream &oct( TQTextStream &s ); // set oct notation -TQ_EXPORT TQTextStream &dec( TQTextStream &s ); // set dec notation -TQ_EXPORT TQTextStream &hex( TQTextStream &s ); // set hex notation -TQ_EXPORT TQTextStream &endl( TQTextStream &s ); // insert EOL ('\n') -TQ_EXPORT TQTextStream &flush( TQTextStream &s ); // flush output -TQ_EXPORT TQTextStream &ws( TQTextStream &s ); // eat whitespace on input -TQ_EXPORT TQTextStream &reset( TQTextStream &s ); // set default flags - -TQ_EXPORT inline TQTSManip qSetW( int w ) -{ - TQTSMFI func = &TQTextStream::width; - return TQTSManip(func,w); -} - -TQ_EXPORT inline TQTSManip qSetFill( int f ) -{ - TQTSMFI func = &TQTextStream::fill; - return TQTSManip(func,f); -} - -TQ_EXPORT inline TQTSManip qSetPrecision( int p ) -{ - TQTSMFI func = &TQTextStream::precision; - return TQTSManip(func,p); -} - -#endif // TQT_NO_TEXTSTREAM -#endif // TQTEXTSTREAM_H diff --git a/tqtinterface/qt4/src/tools/tqthreadinstance_p.h b/tqtinterface/qt4/src/tools/tqthreadinstance_p.h deleted file mode 100644 index 5405472..0000000 --- a/tqtinterface/qt4/src/tools/tqthreadinstance_p.h +++ /dev/null @@ -1,101 +0,0 @@ -/**************************************************************************** -** -** ... -** -** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQTHREAD_P_H -#define TQTHREAD_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of TQThread and TQThreadStorage. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// -// - -#ifdef TQT_THREAD_SUPPORT - -#ifndef TQT_H -#include "tqmutex.h" -#include "tqwindowdefs.h" -#endif // TQT_H - -#ifdef TQ_OS_UNIX -#include <pthread.h> -#endif - -class TQThreadInstance { -public: - static TQThreadInstance *current(); - - void init(unsigned int stackSize); - void deinit(); - - TQMutex *mutex() const; - void terminate(); - - unsigned int stacksize; - void *args[2]; - void **thread_storage; - bool finished : 1; - bool running : 1; - bool orphan : 1; - -#ifdef TQ_OS_UNIX - pthread_cond_t thread_done; - pthread_t thread_id; - - static void *start( void * ); - static void finish( void * ); -#endif // TQ_OS_UNIX - -#ifdef TQ_OS_WIN32 - TQt::HANDLE handle; - unsigned int thread_id; - int waiters; - - static unsigned int __stdcall start( void * ); - static void finish( TQThreadInstance * ); -#endif // TQ_OS_WIN32 -}; - -#endif // TQT_THREAD_SUPPORT -#endif // TQTHREAD_P_H diff --git a/tqtinterface/qt4/src/tools/tqthreadstorage.h b/tqtinterface/qt4/src/tools/tqthreadstorage.h deleted file mode 100644 index a8ccec1..0000000 --- a/tqtinterface/qt4/src/tools/tqthreadstorage.h +++ /dev/null @@ -1,95 +0,0 @@ -/**************************************************************************** -** -** ... -** -** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQTHREADSTORAGE_H -#define TQTHREADSTORAGE_H - -#ifdef TQT_THREAD_SUPPORT - -#ifndef TQT_H -#include "tqglobal.h" -#endif // TQT_H - -class TQ_EXPORT TQThreadStorageData -{ -public: - TQThreadStorageData( void (*func)(void *) ); - ~TQThreadStorageData(); - - void** get() const; - void** set( void* p ); - - static void finish( void** ); - int id; -}; - - -template <class T> -class TQThreadStorage -{ -private: - TQThreadStorageData d; - -#if defined(TQ_DISABLE_COPY) - // disable copy constructor and operator= - TQThreadStorage( const TQThreadStorage & ); - TQThreadStorage &operator=( const TQThreadStorage & ); -#endif // TQ_DISABLE_COPY - - static void deleteData( void *x ) { delete (T)x; } - -public: - inline TQThreadStorage() : d( deleteData ) { } - inline ~TQThreadStorage() { } - - inline bool hasLocalData() const - { return d.get() != 0; } - - inline T& localData() - { void **v = d.get(); if ( !v ) v = d.set( 0 ); return *(T*)v; } - - inline T localData() const - { void **v = d.get(); return ( v ? *(T*)v : 0 ); } - - inline void setLocalData( T t ) - { (void) d.set( t ); } -}; - -#endif // TQT_THREAD_SUPPORT - -#endif // TQTHREADSTORAGE_H diff --git a/tqtinterface/qt4/src/tools/tqthreadstorage_unix.cpp b/tqtinterface/qt4/src/tools/tqthreadstorage_unix.cpp deleted file mode 100644 index 4f17c39..0000000 --- a/tqtinterface/qt4/src/tools/tqthreadstorage_unix.cpp +++ /dev/null @@ -1,349 +0,0 @@ -/**************************************************************************** -** -** ... -** -** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifdef TQT_THREAD_SUPPORT - -#include "tqplatformdefs.h" - -#include "tqthreadstorage.h" -#include <private/tqthreadinstance_p.h> - -#include <string.h> - -// #define TQTHREADSTORAGE_DEBUG - - -// keep this in sync with the implementation in qthreadstorage.cpp -static const int MAX_THREAD_STORAGE = 257; // 256 maximum + 1 used in TQRegExp - -static pthread_mutex_t thread_storage_mutex = PTHREAD_MUTEX_INITIALIZER; - -static bool thread_storage_init = FALSE; -static struct { - bool used; - void (*func)( void * ); -} thread_storage_usage[MAX_THREAD_STORAGE]; - - -TQThreadStorageData::TQThreadStorageData( void (*func)( void * ) ) - : id( 0 ) -{ - pthread_mutex_lock( &thread_storage_mutex ); - - // make sure things are initialized - if ( ! thread_storage_init ) - memset( thread_storage_usage, 0, sizeof( thread_storage_usage ) ); - thread_storage_init = TRUE; - - for ( ; id < MAX_THREAD_STORAGE; ++id ) { - if ( !thread_storage_usage[id].used ) - break; - } - - TQ_ASSERT( id >= 0 && id < MAX_THREAD_STORAGE ); - thread_storage_usage[id].used = TRUE; - thread_storage_usage[id].func = func; - -#ifdef TQTHREADSTORAGE_DEBUG - qDebug( "TQThreadStorageData: allocated id %d", id ); -#endif // TQTHREADSTORAGE_DEBUG - - pthread_mutex_unlock( &thread_storage_mutex ); -} - -TQThreadStorageData::~TQThreadStorageData() -{ - pthread_mutex_lock( &thread_storage_mutex ); - thread_storage_usage[id].used = FALSE; - thread_storage_usage[id].func = 0; - -#ifdef TQTHREADSTORAGE_DEBUG - qDebug( "TQThreadStorageData: released id %d", id ); -#endif // TQTHREADSTORAGE_DEBUG - - pthread_mutex_unlock( &thread_storage_mutex ); -} - -void **TQThreadStorageData::get() const -{ - TQThreadInstance *d = TQThreadInstance::current(); - if (!d) { - qWarning("TQThreadStorage can only be used with threads started with TQThread"); - return 0; - } - TQMutexLocker locker( d->mutex() ); - return d->thread_storage && d->thread_storage[id] ? &d->thread_storage[id] : 0; -} - -void **TQThreadStorageData::set( void *p ) -{ - TQThreadInstance *d = TQThreadInstance::current(); - if (!d) { - qWarning("TQThreadStorage can only be used with threads started with TQThread"); - return 0; - } - TQMutexLocker locker( d->mutex() ); - if ( !d->thread_storage ) { -#ifdef TQTHREADSTORAGE_DEBUG - qDebug( "TQThreadStorageData: allocating storage for thread %lx", - (unsigned long) pthread_self() ); -#endif // TQTHREADSTORAGE_DEBUG - - d->thread_storage = new void*[MAX_THREAD_STORAGE]; - memset( d->thread_storage, 0, sizeof( void* ) * MAX_THREAD_STORAGE ); - } - - // delete any previous data - if ( d->thread_storage[id] ) - thread_storage_usage[id].func( d->thread_storage[id] ); - - // store new data - d->thread_storage[id] = p; - return &d->thread_storage[id]; -} - -void TQThreadStorageData::finish( void **thread_storage ) -{ - if ( ! thread_storage ) return; // nothing to do - -#ifdef TQTHREADSTORAGE_DEBUG - qDebug( "TQThreadStorageData: destroying storage for thread %lx", - (unsigned long) pthread_self() ); -#endif // TQTHREADSTORAGE_DEBUG - - for ( int i = 0; i < MAX_THREAD_STORAGE; ++i ) { - if ( ! thread_storage[i] ) continue; - if ( ! thread_storage_usage[i].used ) { -#ifdef TQT_CHECK_STATE - qWarning( "TQThreadStorage: thread %lx exited after TQThreadStorage destroyed", - (unsigned long) pthread_self() ); -#endif // TQT_CHECK_STATE - continue; - } - - thread_storage_usage[i].func( thread_storage[i] ); - } - - delete [] thread_storage; -} - - -/*! - \class TQThreadStorage - \brief The TQThreadStorage class provides per-thread data storage. - - \threadsafe - \ingroup thread - \ingroup environment - - TQThreadStorage is a template class that provides per-thread data - storage. - - \e{Note that due to compiler limitations, TQThreadStorage can only - store pointers.} - - The setLocalData() function stores a single thread-specific value - for the calling thread. The data can be accessed later using the - localData() functions. TQThreadStorage takes ownership of the - data (which must be created on the heap with \e new) and deletes - it when the thread exits (either normally or via termination). - - The hasLocalData() function allows the programmer to determine if - data has previously been set using the setLocalData() function. - This is useful for lazy initializiation. - - For example, the following code uses TQThreadStorage to store a - single cache for each thread that calls the \e cacheObject() and - \e removeFromCache() functions. The cache is automatically - deleted when the calling thread exits (either normally or via - termination). - - \code - TQThreadStorage<TQCache<SomeClass> *> caches; - - void cacheObject( const TQString &key, SomeClass *object ) - { - if ( ! caches.hasLocalData() ) - caches.setLocalData( new TQCache<SomeClass> ); - - caches.localData()->insert( key, object ); - } - - void removeFromCache( const TQString &key ) - { - if ( ! caches.hasLocalData() ) - return; // nothing to do - - caches.localData()->remove( key ); - } - \endcode - - \section1 Caveats - - \list - - \i As noted above, TQThreadStorage can only store pointers due to - compiler limitations. Support for value-based objects will be - added when the majority of compilers are able to support partial - template specialization. - - \i The \link ~TQThreadStorage() destructor\endlink does \e not - delete per-thread data. TQThreadStorage only deletes per-thread - data when the thread exits or when setLocalData() is called - multiple times. - - \i TQThreadStorage can only be used with threads started with - TQThread. It \e cannot be used with threads started with - platform-specific APIs. - - \i As a corollary to the above, platform-specific APIs cannot be - used to exit or terminate a TQThread using TQThreadStorage. Doing so - will cause all per-thread data to be leaked. See TQThread::exit() - and TQThread::terminate(). - - \i TQThreadStorage \e can be used to store data for the \e main() - thread \e after TQApplication has been constructed. TQThreadStorage - deletes all data set for the \e main() thread when TQApplication is - destroyed, regardless of whether or not the \e main() thread has - actually finished. - - \i The implementation of TQThreadStorage limits the total number of - TQThreadStorage objects to 256. An unlimited number of threads - can store per-thread data in each TQThreadStorage object. - - \endlist -*/ - -/*! - \fn TQThreadStorage::TQThreadStorage() - - Constructs a new per-thread data storage object. -*/ - -/*! - \fn TQThreadStorage::~TQThreadStorage() - - Destroys the per-thread data storage object. - - Note: The per-thread data stored is \e not deleted. Any data left - in TQThreadStorage is leaked. Make sure that all threads using - TQThreadStorage have exited before deleting the TQThreadStorage. - - \sa hasLocalData() -*/ - -/*! - \fn bool TQThreadStorage::hasLocalData() const - - Returns TRUE if the calling thread has non-zero data available; - otherwise returns FALSE. - - \sa localData() -*/ - -/*! - \fn T& TQThreadStorage::localData() - - Returns a reference to the data that was set by the calling - thread. - - Note: TQThreadStorage can only store pointers. This function - returns a \e reference to the pointer that was set by the calling - thread. The value of this reference is 0 if no data was set by - the calling thread, - - \sa hasLocalData() -*/ -/* - ### addition to the above documentation when we start supporting - ### partial template specialization, and TQThreadStorage can store - ### values *and* pointers - - When using TQThreadStorage to store values (not pointers), this - function stores an object of type \e T (created with its default - constructor) and returns a reference to that object. -*/ - -/*! - \fn const T TQThreadStorage::localData() const - \overload - - Returns a copy of the data that was set by the calling thread. - - Note: TQThreadStorage can only store pointers. This function - returns a pointer to the data that was set by the calling thread. - If no data was set by the calling thread, this function returns 0. - - \sa hasLocalData() -*/ -/* - ### addition to the above documentation when we start supporting - ### partial template specialization, and TQThreadStorage can store - ### values *and* pointers - - When using TQThreadStorage to store values (not pointers), this - function returns an object of type \e T (created with its default - constructor). Unlike the above function, this object is \e not - stored automatically. You will need to call setLocalData() to store - the object. -*/ - -/*! - \fn void TQThreadStorage::setLocalData( T data ) - - Sets the local data for the calling thread to \a data. It can be - accessed later using the localData() functions. - - If \a data is 0, this function deletes the previous data (if - any) and returns immediately. - - If \a data is non-zero, TQThreadStorage takes ownership of the \a - data and deletes it automatically either when the thread exits - (either normally or via termination) or when setLocalData() is - called again. - - Note: TQThreadStorage can only store pointers. The \a data - argument must be either a pointer to an object created on the heap - (i.e. using \e new) or 0. You should not delete \a data - yourself; TQThreadStorage takes ownership and will delete the \a - data itself. - - \sa localData() hasLocalData() -*/ - -#endif // TQT_THREAD_SUPPORT diff --git a/tqtinterface/qt4/src/tools/tqtl.h b/tqtinterface/qt4/src/tools/tqtl.h deleted file mode 100644 index 3f02d84..0000000 --- a/tqtinterface/qt4/src/tools/tqtl.h +++ /dev/null @@ -1,325 +0,0 @@ -/**************************************************************************** -** -** Definition of TQt template library classes -** -** Created : 990128 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQTL_H -#define TQTL_H - -#ifndef TQT_H -#include "tqglobal.h" -#include "tqtextstream.h" -#include "tqstring.h" -#endif // TQT_H - -#ifndef TQT_NO_TEXTSTREAM -template <class T> -class TQTextOStreamIterator -{ -protected: - TQTextOStream& stream; - TQString separator; - -public: - TQTextOStreamIterator( TQTextOStream& s) : stream( s ) {} - TQTextOStreamIterator( TQTextOStream& s, const TQString& sep ) - : stream( s ), separator( sep ) {} - TQTextOStreamIterator<T>& operator= ( const T& x ) { - stream << x; - if ( !separator.isEmpty() ) - stream << separator; - return *this; - } - TQTextOStreamIterator<T>& operator*() { return *this; } - TQTextOStreamIterator<T>& operator++() { return *this; } - TQTextOStreamIterator<T>& operator++(int) { return *this; } -}; -#endif //TQT_NO_TEXTSTREAM - -template <class InputIterator, class OutputIterator> -inline OutputIterator tqCopy( InputIterator _begin, InputIterator _end, - OutputIterator _dest ) -{ - while( _begin != _end ) - *_dest++ = *_begin++; - return _dest; -} - -template <class BiIterator, class BiOutputIterator> -inline BiOutputIterator tqCopyBackward( BiIterator _begin, BiIterator _end, - BiOutputIterator _dest ) -{ - while ( _begin != _end ) - *--_dest = *--_end; - return _dest; -} - -template <class InputIterator1, class InputIterator2> -inline bool tqEqual( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 ) -{ - // ### compare using !(*first1 == *first2) in TQt 4.0 - for ( ; first1 != last1; ++first1, ++first2 ) - if ( *first1 != *first2 ) - return FALSE; - return TRUE; -} - -template <class ForwardIterator, class T> -inline void tqFill( ForwardIterator first, ForwardIterator last, const T& val ) -{ - for ( ; first != last; ++first ) - *first = val; -} - -#if 0 -template <class BiIterator, class OutputIterator> -inline OutputIterator qReverseCopy( BiIterator _begin, BiIterator _end, - OutputIterator _dest ) -{ - while ( _begin != _end ) { - --_end; - *_dest = *_end; - ++_dest; - } - return _dest; -} -#endif - - -template <class InputIterator, class T> -inline InputIterator tqFind( InputIterator first, InputIterator last, - const T& val ) -{ - while ( first != last && *first != val ) - ++first; - return first; -} - -template <class InputIterator, class T, class Size> -inline void tqCount( InputIterator first, InputIterator last, const T& value, - Size& n ) -{ - for ( ; first != last; ++first ) - if ( *first == value ) - ++n; -} - -template <class T> -inline void tqSwap( T& _value1, T& _value2 ) -{ - T tmp = _value1; - _value1 = _value2; - _value2 = tmp; -} - - -template <class InputIterator> -TQ_INLINE_TEMPLATES void qBubbleSort( InputIterator b, InputIterator e ) -{ - // Goto last element; - InputIterator last = e; - --last; - // only one element or no elements ? - if ( last == b ) - return; - - // So we have at least two elements in here - while( b != last ) { - bool swapped = FALSE; - InputIterator swap_pos = b; - InputIterator x = e; - InputIterator y = x; - y--; - do { - --x; - --y; - if ( *x < *y ) { - swapped = TRUE; - tqSwap( *x, *y ); - swap_pos = y; - } - } while( y != b ); - if ( !swapped ) - return; - b = swap_pos; - b++; - } -} - - -template <class Container> -inline void qBubbleSort( Container &c ) -{ - qBubbleSort( c.begin(), c.end() ); -} - - -template <class Value> -TQ_INLINE_TEMPLATES void qHeapSortPushDown( Value* heap, int first, int last ) -{ - int r = first; - while ( r <= last / 2 ) { - if ( last == 2 * r ) { - // node r has only one child - if ( heap[2 * r] < heap[r] ) - tqSwap( heap[r], heap[2 * r] ); - r = last; - } else { - // node r has two tqchildren - if ( heap[2 * r] < heap[r] && !(heap[2 * r + 1] < heap[2 * r]) ) { - // swap with left child - tqSwap( heap[r], heap[2 * r] ); - r *= 2; - } else if ( heap[2 * r + 1] < heap[r] - && heap[2 * r + 1] < heap[2 * r] ) { - // swap with right child - tqSwap( heap[r], heap[2 * r + 1] ); - r = 2 * r + 1; - } else { - r = last; - } - } - } -} - - -template <class InputIterator, class Value> -TQ_INLINE_TEMPLATES void qHeapSortHelper( InputIterator b, InputIterator e, Value, uint n ) -{ - // Create the heap - InputIterator insert = b; - Value* realheap = new Value[n]; - // Wow, what a fake. But I want the heap to be indexed as 1...n - Value* heap = realheap - 1; - int size = 0; - for( ; insert != e; ++insert ) { - heap[++size] = *insert; - int i = size; - while( i > 1 && heap[i] < heap[i / 2] ) { - tqSwap( heap[i], heap[i / 2] ); - i /= 2; - } - } - - // Now do the sorting - for( uint i = n; i > 0; i-- ) { - *b++ = heap[1]; - if ( i > 1 ) { - heap[1] = heap[i]; - qHeapSortPushDown( heap, 1, (int)i - 1 ); - } - } - - delete[] realheap; -} - - -template <class InputIterator> -TQ_INLINE_TEMPLATES void qHeapSort( InputIterator b, InputIterator e ) -{ - // Empty ? - if ( b == e ) - return; - - // How many entries have to be sorted ? - InputIterator it = b; - uint n = 0; - while ( it != e ) { - ++n; - ++it; - } - - // The second last parameter is a hack to retrieve the value type - // Do the real sorting here - qHeapSortHelper( b, e, *b, n ); -} - - -template <class Container> -TQ_INLINE_TEMPLATES void qHeapSort( Container &c ) -{ - if ( c.begin() == c.end() ) - return; - - // The second last parameter is a hack to retrieve the value type - // Do the real sorting here - qHeapSortHelper( c.begin(), c.end(), *(c.begin()), (uint)c.count() ); -} - -template <class Container> -class TQBackInsertIterator -{ -public: - TQ_EXPLICIT TQBackInsertIterator( Container &c ) - : container( &c ) - { - } - - TQBackInsertIterator<Container>& - operator=( const TQ_TYPENAME Container::value_type &value ) - { - container->push_back( value ); - return *this; - } - - TQBackInsertIterator<Container>& operator*() - { - return *this; - } - - TQBackInsertIterator<Container>& operator++() - { - return *this; - } - - TQBackInsertIterator<Container>& operator++(int) - { - return *this; - } - -protected: - Container *container; -}; - -template <class Container> -inline TQBackInsertIterator<Container> qBackInserter( Container &c ) -{ - return TQBackInsertIterator<Container>( c ); -} - -#endif diff --git a/tqtinterface/qt4/src/tools/tqucom.cpp b/tqtinterface/qt4/src/tools/tqucom.cpp deleted file mode 100644 index 7f77a39..0000000 --- a/tqtinterface/qt4/src/tools/tqucom.cpp +++ /dev/null @@ -1,547 +0,0 @@ -/**************************************************************************** -** -** Implementation of the TQUcom classes -** -** Created : 990101 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqucom_p.h" - -// Standard types - -// {DE56510E-4E9F-4b76-A3C2-D1E2EF42F1AC} -const TQUuid TID_TQUType_Null( 0xde56510e, 0x4e9f, 0x4b76, 0xa3, 0xc2, 0xd1, 0xe2, 0xef, 0x42, 0xf1, 0xac ); -const TQUuid *TQUType_Null::uuid() const { return &TID_TQUType_Null; } -const char *TQUType_Null::desc() const { return "null"; } -bool TQUType_Null::canConvertFrom( TQUObject *, TQUType * ) { return FALSE; } -bool TQUType_Null::canConvertTo( TQUObject *, TQUType * ) { return FALSE; } -bool TQUType_Null::convertFrom( TQUObject *, TQUType * ) { return FALSE; } -bool TQUType_Null::convertTo( TQUObject *, TQUType * ) { return FALSE; } -void TQUType_Null::clear( TQUObject *) {} -int TQUType_Null::serializeTo( TQUObject *, TQUBuffer * ) { return 0; } -int TQUType_Null::serializeFrom( TQUObject *, TQUBuffer * ) { return 0; } -TQUType_Null static_TQUType_Null; - - -// {7EE17B08-5419-47e2-9776-8EEA112DCAEC} -const TQUuid TID_TQUType_enum( 0x7ee17b08, 0x5419, 0x47e2, 0x97, 0x76, 0x8e, 0xea, 0x11, 0x2d, 0xca, 0xec ); -TQUType_enum static_TQUType_enum; -const TQUuid *TQUType_enum::uuid() const { return &TID_TQUType_enum; } -const char *TQUType_enum::desc() const { return "enum"; } -void TQUType_enum::set( TQUObject *o, int v ) -{ - o->payload.i = v; - o->type = this; -} - -bool TQUType_enum::canConvertFrom( TQUObject *o, TQUType *t ) -{ - if ( isEqual( t, &static_TQUType_int ) ) // ## todo unsigned int? - return TRUE; - - return t->canConvertTo( o, this ); -} - -bool TQUType_enum::canConvertTo( TQUObject * /*o*/, TQUType *t ) -{ - return isEqual( t, &static_TQUType_int ); -} - -bool TQUType_enum::convertFrom( TQUObject *o, TQUType *t ) -{ - if ( isEqual( t, &static_TQUType_int ) ) // ## todo unsigned int? - ; - else - return t->convertTo( o, this ); - - o->type = this; - return TRUE; -} - -bool TQUType_enum::convertTo( TQUObject *o, TQUType *t ) -{ - if ( isEqual( t, &static_TQUType_int ) ) { - o->type = &static_TQUType_int; - return TRUE; - } - return FALSE; -} - -int TQUType_enum::serializeTo( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -int TQUType_enum::serializeFrom( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -// {8AC26448-5AB4-49eb-968C-8F30AB13D732} -const TQUuid TID_TQUType_ptr( 0x8ac26448, 0x5ab4, 0x49eb, 0x96, 0x8c, 0x8f, 0x30, 0xab, 0x13, 0xd7, 0x32 ); -TQUType_ptr static_TQUType_ptr; -const TQUuid *TQUType_ptr::uuid() const { return &TID_TQUType_ptr; } -const char *TQUType_ptr::desc() const { return "ptr"; } - -void TQUType_ptr::set( TQUObject *o, const void* v ) -{ - o->payload.ptr = (void*) v; - o->type = this; -} - -bool TQUType_ptr::canConvertFrom( TQUObject *o, TQUType *t ) -{ - return t->canConvertTo( o, this ); -} - -bool TQUType_ptr::canConvertTo( TQUObject *, TQUType * ) -{ - return FALSE; -} - -bool TQUType_ptr::convertFrom( TQUObject *o, TQUType *t ) -{ - return t->convertTo( o, this ); -} - -bool TQUType_ptr::convertTo( TQUObject *, TQUType * ) -{ - return FALSE; -} - -int TQUType_ptr::serializeTo( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -int TQUType_ptr::serializeFrom( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -// {97A2594D-6496-4402-A11E-55AEF2D4D25C} -const TQUuid TID_TQUType_iface( 0x97a2594d, 0x6496, 0x4402, 0xa1, 0x1e, 0x55, 0xae, 0xf2, 0xd4, 0xd2, 0x5c ); -TQUType_iface static_TQUType_iface; -const TQUuid *TQUType_iface::uuid() const { return &TID_TQUType_iface; } -const char *TQUType_iface::desc() const { return "UnknownInterface"; } - -void TQUType_iface::set( TQUObject *o, TQUnknownInterface* iface ) -{ - o->payload.iface = iface; - o->type = this; -} - -bool TQUType_iface::canConvertFrom( TQUObject *o, TQUType *t ) -{ - return t->canConvertTo( o, this ); -} - -bool TQUType_iface::canConvertTo( TQUObject *, TQUType * ) -{ - return FALSE; -} - -bool TQUType_iface::convertFrom( TQUObject *o, TQUType *t ) -{ - return t->convertTo( o, this ); -} - -bool TQUType_iface::convertTo( TQUObject *, TQUType * ) -{ - return FALSE; -} - -int TQUType_iface::serializeTo( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -int TQUType_iface::serializeFrom( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -// {2F358164-E28F-4bf4-9FA9-4E0CDCABA50B} -const TQUuid TID_TQUType_idisp( 0x2f358164, 0xe28f, 0x4bf4, 0x9f, 0xa9, 0x4e, 0xc, 0xdc, 0xab, 0xa5, 0xb ); -TQUType_idisp static_TQUType_idisp; -const TQUuid *TQUType_idisp::uuid() const { return &TID_TQUType_idisp; } -const char *TQUType_idisp::desc() const { return "DispatchInterface"; } - -void TQUType_idisp::set( TQUObject *o, TQDispatchInterface* idisp ) -{ - o->payload.idisp = idisp; - o->type = this; -} - -bool TQUType_idisp::canConvertFrom( TQUObject *o, TQUType *t ) -{ - return t->canConvertTo( o, this ); -} - -bool TQUType_idisp::canConvertTo( TQUObject * /*o*/, TQUType *t ) -{ - return isEqual( t, &static_TQUType_iface ); -} - -bool TQUType_idisp::convertFrom( TQUObject *o, TQUType *t ) -{ - return t->convertTo( o, this ); -} - -bool TQUType_idisp::convertTo( TQUObject *o, TQUType *t ) -{ -#ifndef TQT_NO_COMPONENT - if ( isEqual( t, &static_TQUType_iface ) ) { - o->payload.iface = (TQUnknownInterface*)o->payload.idisp; - o->type = &static_TQUType_iface; - return TRUE; - } -#endif - return FALSE; -} - -int TQUType_idisp::serializeTo( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -int TQUType_idisp::serializeFrom( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -// {CA42115D-13D0-456c-82B5-FC10187F313E} -const TQUuid TID_TQUType_bool( 0xca42115d, 0x13d0, 0x456c, 0x82, 0xb5, 0xfc, 0x10, 0x18, 0x7f, 0x31, 0x3e ); -TQUType_bool static_TQUType_bool; -const TQUuid *TQUType_bool::uuid() const { return &TID_TQUType_bool; } -const char *TQUType_bool::desc() const { return "bool"; } - -void TQUType_bool::set( TQUObject *o, bool v ) -{ - o->payload.b = v; - o->type = this; -} - -bool TQUType_bool::canConvertFrom( TQUObject *o, TQUType *t ) -{ - return t->canConvertTo( o, this ); -} - -bool TQUType_bool::canConvertTo( TQUObject *, TQUType * ) -{ - return FALSE; -} - -bool TQUType_bool::convertFrom( TQUObject *o, TQUType *t ) -{ - return t->convertTo( o, this ); -} - -bool TQUType_bool::convertTo( TQUObject *, TQUType * ) -{ - return FALSE; -} - -int TQUType_bool::serializeTo( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -int TQUType_bool::serializeFrom( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -// {53C1F3BE-73C3-4c7d-9E05-CCF09EB676B5} -const TQUuid TID_TQUType_int( 0x53c1f3be, 0x73c3, 0x4c7d, 0x9e, 0x5, 0xcc, 0xf0, 0x9e, 0xb6, 0x76, 0xb5 ); -TQUType_int static_TQUType_int; -const TQUuid *TQUType_int::uuid() const { return &TID_TQUType_int; } -const char *TQUType_int::desc() const { return "int"; } - -void TQUType_int::set( TQUObject *o, int v ) -{ - o->payload.i = v; - o->type = this; -} - -bool TQUType_int::canConvertFrom( TQUObject *o, TQUType *t ) -{ - if ( isEqual( t, &static_TQUType_double ) ) - return TRUE; - - return t->canConvertTo( o, this ); -} - -bool TQUType_int::canConvertTo( TQUObject * /*o*/, TQUType *t ) -{ - return isEqual( t, &static_TQUType_double ); -} - -bool TQUType_int::convertFrom( TQUObject *o, TQUType *t ) -{ - if ( isEqual( t, &static_TQUType_double ) ) - o->payload.i = (long)o->payload.d; - else - return t->convertTo( o, this ); - - o->type = this; - return TRUE; -} - -bool TQUType_int::convertTo( TQUObject *o, TQUType *t ) -{ - if ( isEqual( t, &static_TQUType_double ) ) { - o->payload.d = (double)o->payload.i; - o->type = &static_TQUType_double; - } else - return FALSE; - return TRUE; -} - -int TQUType_int::serializeTo( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -int TQUType_int::serializeFrom( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -// {2D0974E5-0BA6-4ec2-8837-C198972CB48C} -const TQUuid TID_TQUType_double( 0x2d0974e5, 0xba6, 0x4ec2, 0x88, 0x37, 0xc1, 0x98, 0x97, 0x2c, 0xb4, 0x8c ); -TQUType_double static_TQUType_double; -const TQUuid *TQUType_double::uuid() const { return &TID_TQUType_double; } -const char *TQUType_double::desc() const {return "double"; } - -void TQUType_double::set( TQUObject *o, double v ) -{ - o->payload.d = v; - o->type = this; -} - -bool TQUType_double::canConvertFrom( TQUObject *o, TQUType *t ) -{ - if ( isEqual( t, &static_TQUType_int ) ) - return TRUE; - - return t->canConvertTo( o, this ); -} - -bool TQUType_double::canConvertTo( TQUObject * /*o*/, TQUType *t ) -{ - return isEqual( t, &static_TQUType_int ); -} - -bool TQUType_double::convertFrom( TQUObject *o, TQUType *t ) -{ - if ( isEqual( t, &static_TQUType_int ) ) - o->payload.d = (double)o->payload.i; - else - return t->convertTo( o, this ); - - o->type = this; - return TRUE; -} - -bool TQUType_double::convertTo( TQUObject *o, TQUType *t ) -{ - if ( isEqual( t, &static_TQUType_int ) ) { - o->payload.i = (int) o->payload.d; - o->type = &static_TQUType_int; - } else if ( isEqual( t, &static_TQUType_double ) ) { - o->payload.d = (double) o->payload.f; - o->type = &static_TQUType_double; - } else - return FALSE; - return TRUE; -} - -int TQUType_double::serializeTo( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -int TQUType_double::serializeFrom( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -// {EFCDD1D4-77A3-4b8e-8D46-DC14B8D393E9} -const TQUuid TID_TQUType_charstar( 0xefcdd1d4, 0x77a3, 0x4b8e, 0x8d, 0x46, 0xdc, 0x14, 0xb8, 0xd3, 0x93, 0xe9 ); -TQUType_charstar static_TQUType_charstar; -const TQUuid *TQUType_charstar::uuid() const { return &TID_TQUType_charstar; } -const char *TQUType_charstar::desc() const { return "char*"; } - -void TQUType_charstar::set( TQUObject *o, const char* v, bool take ) -{ - if ( take ) { - if ( v ) { - o->payload.charstar.ptr = new char[ strlen(v) + 1 ]; - strcpy( o->payload.charstar.ptr, v ); - } else { - o->payload.charstar.ptr = 0; - } - o->payload.charstar.owner = TRUE; - } else { - o->payload.charstar.ptr = (char*) v; - o->payload.charstar.owner = FALSE; - } - o->type = this; -} - -bool TQUType_charstar::canConvertFrom( TQUObject *o, TQUType *t ) -{ - return t->canConvertTo( o, this ); -} - -bool TQUType_charstar::canConvertTo( TQUObject *, TQUType * ) -{ - return FALSE; -} - -bool TQUType_charstar::convertFrom( TQUObject *o, TQUType *t ) -{ - return t->convertTo( o, this ); -} - -bool TQUType_charstar::convertTo( TQUObject *, TQUType * ) -{ - return FALSE; -} - -void TQUType_charstar::clear( TQUObject *o ) -{ - if ( o->payload.charstar.owner ) - delete [] o->payload.charstar.ptr; - o->payload.charstar.ptr = 0; -} - -int TQUType_charstar::serializeTo( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -int TQUType_charstar::serializeFrom( TQUObject *, TQUBuffer * ) -{ - return 0; -} - - -// TQt specific types - -// {44C2A547-01E7-4e56-8559-35AF9D2F42B7} -const TQUuid TID_TQUType_TQString( 0x44c2a547, 0x1e7, 0x4e56, 0x85, 0x59, 0x35, 0xaf, 0x9d, 0x2f, 0x42, 0xb7 ); -TQUType_TQString static_TQUType_TQString; -const TQUuid *TQUType_TQString::uuid() const { return &TID_TQUType_TQString; } -const char *TQUType_TQString::desc() const { return "TQString"; } - -void TQUType_TQString::set( TQUObject *o, const TQString& v ) -{ - o->payload.ptr = new TQString( v ); - o->type = this; -} - -bool TQUType_TQString::canConvertFrom( TQUObject *o, TQUType *t ) -{ - if ( isEqual( t, &static_TQUType_charstar ) || - isEqual( t, &static_TQUType_double ) || - isEqual( t, &static_TQUType_int ) ) - return TRUE; - - return t->canConvertTo( o, this ); -} - -bool TQUType_TQString::canConvertTo( TQUObject * /*o*/, TQUType *t ) -{ - return isEqual( t, &static_TQUType_charstar ) || - isEqual( t, &static_TQUType_int ) || - isEqual( t, &static_TQUType_double ); -} - -bool TQUType_TQString::convertFrom( TQUObject *o, TQUType *t ) -{ - TQString *str = 0; - if ( isEqual( t, &static_TQUType_charstar ) ) - str = new TQString( o->payload.charstar.ptr ); - else if ( isEqual( t, &static_TQUType_double ) ) - str = new TQString( TQString::number( o->payload.d ) ); - else if ( isEqual( t, &static_TQUType_int ) ) - str = new TQString( TQString::number( o->payload.i ) ); - else - return t->convertTo( o, this ); - - o->type->clear( o ); - o->payload.ptr = str; - o->type = this; - return TRUE; -} - -bool TQUType_TQString::convertTo( TQUObject *o, TQUType *t ) -{ - TQString *str = (TQString *)o->payload.ptr; - if ( isEqual( t, &static_TQUType_charstar ) ) { - o->payload.charstar.ptr = qstrdup( str->local8Bit().data() ); - o->payload.charstar.owner = TRUE; - o->type = &static_TQUType_charstar; - } else if ( isEqual( t, &static_TQUType_int ) ) { - o->payload.l = str->toLong(); - o->type = &static_TQUType_int; - } else if ( isEqual( t, &static_TQUType_double ) ) { - o->payload.d = str->toDouble(); - o->type = &static_TQUType_double; - } else { - return FALSE; - } - delete str; - return TRUE; -} - -int TQUType_TQString::serializeTo( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -int TQUType_TQString::serializeFrom( TQUObject *, TQUBuffer * ) -{ - return 0; -} - -void TQUType_TQString::clear( TQUObject *o ) -{ - delete (TQString*)o->payload.ptr; - o->payload.ptr = 0; -} diff --git a/tqtinterface/qt4/src/tools/tqucom_p.h b/tqtinterface/qt4/src/tools/tqucom_p.h deleted file mode 100644 index 546e0f2..0000000 --- a/tqtinterface/qt4/src/tools/tqucom_p.h +++ /dev/null @@ -1,470 +0,0 @@ -/**************************************************************************** -** -** Definition of the TQUcom interfaces -** -** Created : 990101 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQUCOM_P_H -#define TQUCOM_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of a number of TQt sources files. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// -// - -#ifndef TQT_H -#include "tqstring.h" -#include "tquuid.h" -#endif // TQT_H - -#ifdef check -#undef check -#endif - -#if __GNUC__ - 0 > 3 -#pragma GCC system_header -#endif - -struct TQUObject; -struct TQUInterfaceDescription; -struct TQUnknownInterface; -struct TQDispatchInterface; - - -struct TQ_EXPORT TQUBuffer -{ - virtual long read( char *data, ulong maxlen ) = 0; - virtual long write( const char *data, ulong len ) = 0; -}; - - -// A type for a TQUObject -struct TQ_EXPORT TQUType -{ - virtual const TQUuid *uuid() const = 0; - virtual const char *desc() const = 0; - - - virtual bool canConvertFrom( TQUObject *, TQUType * ) = 0; - // virtual private, only called by canConvertFrom - virtual bool canConvertTo( TQUObject *, TQUType * ) = 0; - - - virtual bool convertFrom( TQUObject *, TQUType * ) = 0; - // virtual private, only called by convertFrom - virtual bool convertTo( TQUObject *, TQUType * ) = 0; - - virtual void clear( TQUObject * ) = 0; - - virtual int serializeTo( TQUObject *, TQUBuffer * ) = 0; - virtual int serializeFrom( TQUObject *, TQUBuffer * ) = 0; - - static bool isEqual( const TQUType *t1, const TQUType *t2 ); - static bool check( TQUObject* o, TQUType* t ); -}; - - -// {DE56510E-4E9F-4b76-A3C2-D1E2EF42F1AC} -extern TQ_EXPORT const TQUuid TID_TQUType_Null; -struct TQ_EXPORT TQUType_Null : public TQUType -{ - const TQUuid *uuid() const; - const char *desc() const; - - bool canConvertFrom( TQUObject *, TQUType * ); - bool canConvertTo( TQUObject *, TQUType * ); - bool convertFrom( TQUObject *, TQUType * ); - bool convertTo( TQUObject *, TQUType * ); - void clear( TQUObject * ); - int serializeTo( TQUObject *, TQUBuffer * ); - int serializeFrom( TQUObject *, TQUBuffer * ); -}; -extern TQ_EXPORT TQUType_Null static_TQUType_Null; - - -// The magic TQUObject -struct TQ_EXPORT TQUObject -{ -public: // scary MSVC bug makes this necessary - TQUObject() : type( &static_TQUType_Null ) {} - ~TQUObject() { type->clear( this ); } - - TQUType *type; - - // the unavoidable union - union - { - bool b; - - char c; - short s; - int i; - long l; - - unsigned char uc; - unsigned short us; - unsigned int ui; - unsigned long ul; - - float f; - double d; - - char byte[16]; - - struct { - char* data; - unsigned long size; - } bytearray; - - void* ptr; - - struct { - void *ptr; - bool owner; - } voidstar; - - struct { - char *ptr; - bool owner; - } charstar; - - struct { - char *ptr; - bool owner; - } utf8; - - struct { - char *ptr; - bool owner; - } local8bit; - - TQUnknownInterface* iface; - TQDispatchInterface* idisp; - - } payload; - -}; - - -// A parameter description describes one method parameters. A -// parameter has a name, a type and a flag describing whether it's an -// in parameter, an out parameter, or both ways -struct TQ_EXPORT TQUParameter -{ - const char* name; - TQUType *type; - const void* typeExtra; //Usually 0, UEnum* for TQUType_enum, const char* for TQUType_ptr, int* for TQUType_varptr - enum { In = 1, Out = 2, InOut = In | Out }; - int inOut; -}; - -// A method description describes one method. A method has a name and -// an array of parameters. -struct TQ_EXPORT TQUMethod -{ - const char* name; - int count; - const TQUParameter* parameters; -}; - -// A Property description. Not used yet in the example. -struct TQ_EXPORT TQUProperty -{ - const char* name; - TQUType* type; - const void* typeExtra; //type dependend. Usually 0, but UEnum for TQUTypeenum or const char* for TQUTypeptr - - int set; // -1 undefined - int get; // -1 undefined - - int designable; // -1 FALSE, -2 TRUE, else method - int stored; // -1 FALSE, -2 TRUE, else method -}; - -// An interface description describes one interface, that is all its -// methods and properties. -struct TQ_EXPORT TQUInterfaceDescription -{ - int methodCount; - const TQUMethod* methods; - int propertyCount; - const TQUProperty* properties; -}; - - -// A component description describe one component, that is its name, -// vendor, release, info, its component uuid and all its interface -// uuids. -struct TQ_EXPORT TQUComponentDescription -{ - const char* name; - const char* vendor; - const char* release; - const char* info; - TQUuid cid; - int count; - const TQUuid* interfaces; -}; - - -// A component server description describe one component server, that -// is its name, vendor, release, info and the descriptions of all -// components it can instantiate. -struct TQ_EXPORT TQUComponentServerDescription -{ - const char* name; - const char* vendor; - const char* release; - const char* info; - int count; - const TQUComponentDescription* components; -}; - - - -struct TQ_EXPORT TQUEnumItem // - a name/value pair -{ - const char *key; - int value; -}; - -struct TQ_EXPORT TQUEnum -{ - const char *name; // - enumerator name - unsigned int count; // - number of values - const TQUEnumItem *items; // - the name/value pairs - bool set; // whether enum has to be treated as a set -}; - -inline bool TQUType::isEqual( const TQUType *t1, const TQUType *t2 ) { - return t1 == t2 || t1->uuid() == t2->uuid() || - *(t1->uuid()) == *(t2->uuid()); -} - -inline bool TQUType::check( TQUObject* o, TQUType* t ) { - return isEqual( o->type, t ) || t->convertFrom( o, o->type ); -} - - - -// {7EE17B08-5419-47e2-9776-8EEA112DCAEC} -extern TQ_EXPORT const TQUuid TID_TQUType_enum; -struct TQ_EXPORT TQUType_enum : public TQUType -{ - const TQUuid *uuid() const; - const char *desc() const; - - void set( TQUObject *, int ); - int &get( TQUObject * o ) { return o->payload.i; } - bool canConvertFrom( TQUObject *, TQUType * ); - bool canConvertTo( TQUObject *, TQUType * ); - bool convertFrom( TQUObject *, TQUType * ); - bool convertTo( TQUObject *, TQUType * ); - void clear( TQUObject * ) {} - int serializeTo( TQUObject *, TQUBuffer * ); - int serializeFrom( TQUObject *, TQUBuffer * ); -}; -extern TQ_EXPORT TQUType_enum static_TQUType_enum; - - -// {8AC26448-5AB4-49eb-968C-8F30AB13D732} -extern TQ_EXPORT const TQUuid TID_TQUType_ptr; -struct TQ_EXPORT TQUType_ptr : public TQUType -{ - const TQUuid *uuid() const; - const char *desc() const; - - void set( TQUObject *, const void* ); - void* &get( TQUObject * o ) { return o->payload.ptr; } - bool canConvertFrom( TQUObject *, TQUType * ); - bool canConvertTo( TQUObject *, TQUType * ); - bool convertFrom( TQUObject *, TQUType * ); - bool convertTo( TQUObject *, TQUType * ); - void clear( TQUObject * ) {} - int serializeTo( TQUObject *, TQUBuffer * ); - int serializeFrom( TQUObject *, TQUBuffer * ); -}; -extern TQ_EXPORT TQUType_ptr static_TQUType_ptr; - -// {97A2594D-6496-4402-A11E-55AEF2D4D25C} -extern TQ_EXPORT const TQUuid TID_TQUType_iface; -struct TQ_EXPORT TQUType_iface : public TQUType -{ - const TQUuid *uuid() const; - const char *desc() const; - - void set( TQUObject *, TQUnknownInterface* ); - TQUnknownInterface* &get( TQUObject *o ){ return o->payload.iface; } - bool canConvertFrom( TQUObject *, TQUType * ); - bool canConvertTo( TQUObject *, TQUType * ); - bool convertFrom( TQUObject *, TQUType * ); - bool convertTo( TQUObject *, TQUType * ); - void clear( TQUObject * ) {} - int serializeTo( TQUObject *, TQUBuffer * ); - int serializeFrom( TQUObject *, TQUBuffer * ); -}; -extern TQ_EXPORT TQUType_iface static_TQUType_iface; - -// {2F358164-E28F-4bf4-9FA9-4E0CDCABA50B} -extern TQ_EXPORT const TQUuid TID_TQUType_idisp; -struct TQ_EXPORT TQUType_idisp : public TQUType -{ - const TQUuid *uuid() const; - const char *desc() const; - - void set( TQUObject *, TQDispatchInterface* ); - TQDispatchInterface* &get( TQUObject *o ){ return o->payload.idisp; } - bool canConvertFrom( TQUObject *, TQUType * ); - bool canConvertTo( TQUObject *, TQUType * ); - bool convertFrom( TQUObject *, TQUType * ); - bool convertTo( TQUObject *, TQUType * ); - void clear( TQUObject * ) {} - int serializeTo( TQUObject *, TQUBuffer * ); - int serializeFrom( TQUObject *, TQUBuffer * ); -}; -extern TQ_EXPORT TQUType_idisp static_TQUType_idisp; - -// {CA42115D-13D0-456c-82B5-FC10187F313E} -extern TQ_EXPORT const TQUuid TID_TQUType_bool; -struct TQ_EXPORT TQUType_bool : public TQUType -{ - const TQUuid *uuid() const; - const char *desc() const; - - void set( TQUObject *, bool ); - bool &get( TQUObject *o ) { return o->payload.b; } - bool canConvertFrom( TQUObject *, TQUType * ); - bool canConvertTo( TQUObject *, TQUType * ); - bool convertFrom( TQUObject *, TQUType * ); - bool convertTo( TQUObject *, TQUType * ); - void clear( TQUObject * ) {} - int serializeTo( TQUObject *, TQUBuffer * ); - int serializeFrom( TQUObject *, TQUBuffer * ); -}; -extern TQ_EXPORT TQUType_bool static_TQUType_bool; - -// {53C1F3BE-73C3-4c7d-9E05-CCF09EB676B5} -extern TQ_EXPORT const TQUuid TID_TQUType_int; -struct TQ_EXPORT TQUType_int : public TQUType -{ - const TQUuid *uuid() const; - const char *desc() const; - - void set( TQUObject *, int ); - int &get( TQUObject *o ) { return o->payload.i; } - bool canConvertFrom( TQUObject *, TQUType * ); - bool canConvertTo( TQUObject *, TQUType * ); - bool convertFrom( TQUObject *, TQUType * ); - bool convertTo( TQUObject *, TQUType * ); - void clear( TQUObject * ) {} - int serializeTo( TQUObject *, TQUBuffer * ); - int serializeFrom( TQUObject *, TQUBuffer * ); -}; -extern TQ_EXPORT TQUType_int static_TQUType_int; - - -// {2D0974E5-0BA6-4ec2-8837-C198972CB48C} -extern TQ_EXPORT const TQUuid TID_TQUType_double; -struct TQ_EXPORT TQUType_double : public TQUType -{ - const TQUuid *uuid() const; - const char *desc() const; - - void set( TQUObject *, double ); - double &get( TQUObject *o ) { return o->payload.d; } - bool canConvertFrom( TQUObject *, TQUType * ); - bool canConvertTo( TQUObject *, TQUType * ); - bool convertFrom( TQUObject *, TQUType * ); - bool convertTo( TQUObject *, TQUType * ); - void clear( TQUObject * ) {} - int serializeTo( TQUObject *, TQUBuffer * ); - int serializeFrom( TQUObject *, TQUBuffer * ); -}; -extern TQ_EXPORT TQUType_double static_TQUType_double; - - -// {EFCDD1D4-77A3-4b8e-8D46-DC14B8D393E9} -extern TQ_EXPORT const TQUuid TID_TQUType_charstar; -struct TQ_EXPORT TQUType_charstar : public TQUType -{ - const TQUuid *uuid() const; - const char *desc() const; - - void set( TQUObject *, const char*, bool take = FALSE ); - char* get( TQUObject *o ){ return o->payload.charstar.ptr; } - bool canConvertFrom( TQUObject *, TQUType * ); - bool canConvertTo( TQUObject *, TQUType * ); - bool convertFrom( TQUObject *, TQUType * ); - bool convertTo( TQUObject *, TQUType * ); - void clear( TQUObject * ); - int serializeTo( TQUObject *, TQUBuffer * ); - int serializeFrom( TQUObject *, TQUBuffer * ); - -}; -extern TQ_EXPORT TQUType_charstar static_TQUType_charstar; - -// {44C2A547-01E7-4e56-8559-35AF9D2F42B7} -extern const TQUuid TID_TQUType_TQString; - -struct TQ_EXPORT TQUType_TQString : public TQUType -{ - const TQUuid *uuid() const; - const char *desc() const; - - void set( TQUObject *, const TQString & ); - TQString &get( TQUObject * o ) { return *(TQString*)o->payload.ptr; } - - bool canConvertFrom( TQUObject *, TQUType * ); - bool canConvertTo( TQUObject *, TQUType * ); - bool convertFrom( TQUObject *, TQUType * ); - bool convertTo( TQUObject *, TQUType * ); - void clear( TQUObject * ); - int serializeTo( TQUObject *, TQUBuffer * ); - int serializeFrom( TQUObject *, TQUBuffer * ); - -}; -extern TQ_EXPORT TQUType_TQString static_TQUType_TQString; - - -#endif // TQUCOM_P_H diff --git a/tqtinterface/qt4/src/tools/tqunicodetables.cpp b/tqtinterface/qt4/src/tools/tqunicodetables.cpp deleted file mode 100644 index df592c8..0000000 --- a/tqtinterface/qt4/src/tools/tqunicodetables.cpp +++ /dev/null @@ -1,13240 +0,0 @@ -/**************************************************************************** -** -** ??? -** -** Copyright (C) 2002-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the kernel module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqunicodetables_p.h" - -/* ------------------------------------------------------------------------- - * tqunicode information - * these tables are generated from the tqunicode reference file - * ftp://ftp.tqunicode.org/Public/3.2-Update/UnicodeData.txt - * - * Lars - * ------------------------------------------------------------------------- - */ - -/* Perl script to generate (run perl -x tools/qstringdata.cpp) - -#!perl - -sub numberize -{ - my(%r, $n, $id); - for $id ( @_ ) { - $i = $id; - $i="" if $i eq "EMPTY"; - $r{$i}=$n++; - } - return %r; -} - - -sub readUnicodeDataLine { - $code = shift @_; - for $n (qw{ - name category combining_class bidi_category - character_decomposition decimal_digit_value digit_value - numeric_value mirrored oldname comment - uppercase lowercase titlecase}) - { - $id = shift @_; - $codes = "${n}_code"; - if ( defined %$codes && defined $$codes{$id} ) { - $id = $$codes{$id}; - } - ${$n}{$code}=$id; - } - $decomp = $character_decomposition{$code}; - if ( length $decomp == 0 ) { - $decomp = "<single>"; - } - if (substr($decomp, 0, 1) ne '<') { - $decomp = "<canonical> " . $decomp; - } - @_ = split(" ", $decomp); - $tag = shift @_; - $tag = $character_decomposition_tag{$tag}; - $decomp = join( ", 0x", @_ ); - $decomp = "0x".$decomp; - $decomposition{$code} = $decomp; - $decomposition_tag{$code} = $tag; - $decomposition_pos{$code} = $position; - $len = scalar(@_); - $decomposition_len{$code} = $len; - -# we use canonical decompositions longer than 1 char -# we exlude Arabic ligatures from the table - if($len > 1 and $tag == 1) { -# ligature to add... - $start = shift @_; - $ligature{$start} = $ligature{$start}." ".$code; - } - -# adjust position - if($len != 0) { - $position += $len + 3; - } -} - - -# Code to integer mappings... -# -%category_code = numberize(qw{ - EMPTY - Mn Mc Me - Nd Nl No - Zs Zl Zp - Cc Cf Cs Co Cn - - Lu Ll Lt Lm Lo - Pc Pd Ps Pe Pi Pf Po - Sm Sc Sk So -}); -%bidi_category_code = numberize(qw{ - L R EN ES ET AN CS B S WS ON LRE LRO AL RLE RLO PDF NSM BN}); -%character_decomposition_tag = numberize(qw{ - <single> <canonical> <font> <noBreak> <initial> <medial> - <final> <isolated> <circle> <super> <sub> <vertical> - <wide> <narrow> <small> <square> <compat> <fraction> -}); -%mirrored_code = numberize(qw{N Y}); - -%joining_code = numberize(qw{U D R C}); - -# we map AI and XX to AL for now, as we can't handle them any better -%line_break_code = numberize(qw{OP CL QU GL NS EX SY - IS PR PO NU AL ID IN HY - BA BB B2 - ZW CM - SA - BK CR LF SG CB SP -}); - -# Read data into hashes... -# -open IN, "UnicodeData.txt"; -$position = 1; -while (<IN>) { - @fields = split /;/; - if ( length($fields[0]) < 5 ) { - if ( $fields[1] =~ /, First>/ ) { - $codeRangeBegin = $fields[0]; - } elsif ( $fields[1] =~ /, Last>/ ) { - for ( $i=hex($codeRangeBegin); $i<=hex($fields[0]); $i+=1 ) { - @fields2 = @fields; - $fields2[0] = sprintf "%lX", $i; - readUnicodeDataLine @fields2; - } - } else { - readUnicodeDataLine @fields; - } - } -} - -open IN2, "ArabicShaping.txt"; -$position = 1; -while (<IN2>) { - @fields = split /;/; - $code = shift @fields; - $dummy = shift @fields; - $join = shift @fields; - $join =~ s/ //g; - $join = $joining_code{$join}; - $joining{$code}=$join; -} - -open IN3, "LineBreak.txt"; -$position = 1; -while (<IN3>) { - @fields = split /;/; - $code = shift @fields; - $break = shift @fields; - if (length($break) > 0) { - chomp $break; - $break =~ s/ .*$//; - - $from = $code; - $to = $code; - if ( length($code) > 5 ) { - $from =~ s,\.\..*,,; - $to =~ s/......//; -# print "$from..$to = $break\n"; - } - if($break eq "AI") { - $break = "AL"; - } - if($break eq "XX") { - $break = "AL"; - } - for ( $i=hex($from); $i<=hex($to); $i+=1 ) { - $breaks{sprintf("%04X",$i)}=$line_break_code{$break}; - } - } -} - -# Build pages... -# -$rowtable_txt = ""; -$row_txt = ""; -$pos = 1; -for $row ( 0..255 ) { - $nonzero=0; - $txt = ""; - for $cell ( 0..255 ) { - $code = sprintf("%02X%02X",$row,$cell); - $info = $category{$code}; - $info = 0 if !defined $info; - $txt .= "\n " if $cell%8 == 0; - $txt .= "$info, "; - } - $therow = $row{$txt}; - if ( !defined $therow ) { - $therow = sprintf("%d",$pos); - $row_txt = $row_txt."$txt\n"; - $row{$txt}=$therow; - $pos += 1; - $size += 256; - } - $rowtable_txt .= "\n " if $row%8 == 0; - $rowtable_txt .= "$therow, "; -} - -print "// START OF GENERATED DATA\n\n"; -print "#ifndef TQT_NO_UNICODETABLES\n\n"; - -# Print pages... -# - -print "const TQ_UINT8 TQUnicodeTables::tqunicode_info[] = {"; -print $rowtable_txt; -$size += 256; -print "\n\n"; -print $row_txt; -print "};\n\n"; -print "// $size bytes\n\n"; - -# Build decomposition tables -# -$rowtable_txt = ""; -$row_txt = ""; -$table_txt = - "const TQ_UINT16 TQUnicodeTables::decomposition_map[] = {\n 0,\n"; -$pos = 1; -for $row ( 0..255 ) { - $nonzero=0; - $txt = ""; - for $cell ( 0..255 ) { - $code = sprintf("%02X%02X",$row,$cell); - $txt .= "\n " if $cell%8 == 0; - if( $decomposition_tag{$code} != 0 ) { - $txt .= " $decomposition_pos{$code},"; - $table_txt .= " $decomposition_tag{$code},"; - $table_txt .= " 0x$code,"; - $table_txt .= " $decomposition{$code}, 0,\n"; - $size += 2 * $decomposition_len{$code} + 6; - } else { - $txt .= " 0,"; - } - } - $therow = $row{$txt}; - if ( !defined $therow ) { - $therow = sprintf("%d",$pos); - $row_txt = $row_txt."$txt\n"; - $row{$txt}=$therow; - $pos += 1; - $size += 512; - } - $rowtable_txt .= "\n " if $row%8 == 0; - $rowtable_txt .= "$therow, "; -} - -# Print decomposition tables -# -print "$table_txt\n};\n\n"; - -print "const TQ_UINT16 TQUnicodeTables::decomposition_info[] = {"; -print "$rowtable_txt\n"; -$size += 512; -print $row_txt; -print "};\n\n"; -print "// $size bytes\n\n"; - - -# build ligature tables -# -$size = 0; -$position = 1; -$pos = 1; -$rowtable_txt = ""; -$row_txt = ""; -$table_txt = - "const TQ_UINT16 TQUnicodeTables::ligature_map[] = {\n 0,\n"; -for $lig_row ( 0..255 ) { - $nonzero=0; - $txt = ""; - for $cell ( 0..255 ) { - $code = sprintf("%02X%02X",$lig_row,$cell); - $txt .= "\n " if $cell%8 == 0; - if( defined $ligature{$code} ) { - $txt .= " $position,"; - @ligature = split(" ", $ligature{$code}); -# we need to sort ligatures according to their length. -# long ones have to come first! - @ligature_sort = sort { $decomposition_len{$b} <=> $decomposition_len{$a} } @ligature; -# now replace each code by its position in -# the decomposition map. - undef(@lig_pos); - for $n (@ligature_sort) { - push(@lig_pos, $decomposition_pos{$n}); - } -# debug info - if( 0 ) { - print "ligatures: $ligature{$code}\n"; - $sort = join(" ", @ligature_sort); - print "sorted : $sort\n"; - } - $lig = join(", ", @lig_pos); - $table_txt .= " $lig, 0,\n"; - $size += 2 * scalar(@ligature) + 2; - $position += scalar(@ligature) + 1; - } else { - $txt .= " 0,"; - } - } - $therow = $lig_row{$txt}; - if ( !defined $therow ) { - $therow = sprintf("%d",$pos); - $row_txt = $row_txt."$txt\n"; - $lig_row{$txt}=$therow; - $pos += 1; - $size += 512; - } - $rowtable_txt .= "\n " if $lig_row%8 == 0; - $rowtable_txt .= "$therow, "; -} - -# Print ligature tables -# -print "$table_txt\n};\n\n"; -print "const TQ_UINT16 TQUnicodeTables::ligature_info[] = {"; -print "$rowtable_txt\n\n"; -$size+=512; -print $row_txt; -print "};\n\n"; -print "// $size bytes\n\n"; - - - -# Build direction/joining/mirrored pages... -# -$rowtable_txt = ""; -$row_txt = ""; -$pos = 1; -for $dir_row ( 0..255 ) { - $txt = ""; - for $cell ( 0..255 ) { - $code = sprintf("%02X%02X",$dir_row,$cell); - $dir = $bidi_category{$code}; - $dir = 0 if !defined $dir; - $join = $joining{$code}; - $join = 0 if !defined $join; - $mirr = $mirrored{$code}; - $mirr = 0 if !defined $mirr; - $info = $dir + 32*$join + 128*$mirr; - $txt .= "\n " if $cell%8 == 0; - $txt .= "$info, "; - } - $therow = $dir_row{$txt}; - if ( !defined $therow ) { - $therow = sprintf("%d",$pos); - $row_txt = $row_txt."$txt\n"; - $dir_row{$txt}=$therow; - $pos += 1; - $size+=256; - } - $rowtable_txt .= "\n " if $dir_row%8 == 0; - $rowtable_txt .= "$therow, "; -} - -# Print pages... -# -print "const TQ_UINT8 TQUnicodeTables::direction_info[] = {"; -print "$rowtable_txt\n\n"; -$size+=256; -print $row_txt; -print "};\n\n"; -print "// $size bytes\n\n"; - -# Build table of combining classes -# -$rowtable_txt = ""; -$row_txt = ""; -$pos = 1; -for $combining_row ( 0..255 ) { - $txt = ""; - for $cell ( 0..255 ) { - $code = sprintf("%02X%02X",$combining_row,$cell); - $info = $combining_class{$code}; - $info = 0 if !defined $info; - $txt .= "\n " if $cell%8 == 0; - $txt .= "$info, "; - } - $therow = $combining_row{$txt}; - if ( !defined $therow ) { - $therow = sprintf("%d",$pos); - $row_txt = $row_txt."$txt\n"; - $combining_row{$txt}=$therow; - $pos += 1; - $size += 256; - } - $rowtable_txt .= "\n " if $combining_row%8 == 0; - $rowtable_txt .= "$therow, "; -} - -# Print pages... -# -print "const TQ_UINT8 TQUnicodeTables::combining_info[] = {"; -print "$rowtable_txt\n\n"; -$size+=256; -print $row_txt; -print "};\n\n"; -print "// $size bytes\n\n"; - -# Build case info -# -$rowtable_txt = ""; -$row_txt = ""; -$pos = 1; -for $row ( 0..255 ) { - $nonzero=0; - $txt = ""; - for $cell ( 0..255 ) { - $code = sprintf("%02X%02X",$row,$cell); - $info = $uppercase{$code}; - if ( length( $info ) eq 0 ) { - $info = $lowercase{$code}; - } - $info =~ s/^0+//; - if ( length( $info ) eq 0 ) { - $info = "0"; - } else { - $info = "0x".lc($info); - } - if ( length( $info ) ne 1 ) { - $nonzero = 1; - } - $txt .= "\n " if $cell%8 == 0; - $txt .= "$info, "; - } - $therow = $case_row{$txt}; - if ( !defined $therow && $nonzero ne 0 ) { - $therow = sprintf("%d",$pos); - $row_txt = $row_txt."$txt\n"; - $case_row{$txt}=$therow; - $pos += 1; - $size += 512; - } - $rowtable_txt .= "\n " if $row%8 == 0; - if ( $nonzero ne 0 ) { - $rowtable_txt .= "$therow, "; - } else { - $rowtable_txt .= "0, "; - } -} - -# Print pages... -# -print "const TQ_UINT16 TQUnicodeTables::case_info[] = {"; -print "$rowtable_txt\n\n"; -$size+=512; -print $row_txt; -print "};\n"; -print "// $size bytes\n\n"; - -# Build decimal info -# -$rowtable_txt = ""; -$row_txt = ""; -$pos = 1; -for $row ( 0..255 ) { - $nonzero=0; - $txt = ""; - for $cell ( 0..255 ) { - $code = sprintf("%02X%02X",$row,$cell); - $info = $digit_value{$code}; - if ( length( $info ) eq 0 ) { - $info = -1; - } else { - $nonzero = 1; - } - $txt .= "\n " if $cell%8 == 0; - $txt .= "$info, "; - } - $therow = $decimal_row{$txt}; - if ( !defined $therow && $nonzero ne 0 ) { - $therow = sprintf("%d",$pos); - $row_txt = $row_txt."$txt\n"; - $decimal_row{$txt}=$therow; - $pos += 1; - $size += 256; - } - $rowtable_txt .= "\n " if $row%8 == 0; - if ( $nonzero ne 0 ) { - $rowtable_txt .= "$therow, "; - } else { - $rowtable_txt .= "0, "; - } -} - -# Print pages... -# -print "const TQ_INT8 TQUnicodeTables::decimal_info[] = {"; -print "$rowtable_txt\n\n"; -$size+=512; -print $row_txt; -print "};\n"; -print "// $size bytes\n\n"; - - -# Build line break info -# -$rowtable_txt = ""; -$row_txt = ""; -$pos = 1; -for $row ( 0..255 ) { - $txt = ""; - for $cell ( 0..255 ) { - $code = sprintf("%02X%02X",$row,$cell); - $info = $breaks{$code}; - if ( length( $info ) eq 0 ) { - $info = $line_break_code{"AL"}; - } - $txt .= "\n " if $cell%8 == 0; - $txt .= "$info, "; - } - $therow = $lb_row{$txt}; - if ( !defined $therow ) { - $therow = sprintf("%d",$pos); - $row_txt = $row_txt."$txt\n"; - $lb_row{$txt}=$therow; - $pos += 1; - $size += 256; - } - $rowtable_txt .= "\n " if $row%8 == 0; - $rowtable_txt .= "$therow, "; -} - -# Print pages... -# -print "const TQ_UINT8 TQUnicodeTables::line_break_info[] = {"; -print "$rowtable_txt\n\n"; -$size+=512; -print $row_txt; -print "};\n"; -print "// $size bytes\n\n"; - - - -print "#endif\n\n"; -print "// END OF GENERATED DATA\n\n"; - - -__END__ - -*/ - -// START OF GENERATED DATA - -#ifndef TQT_NO_UNICODETABLES - -const TQ_UINT8 TQUnicodeTables::tqunicode_info[] = { - 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, - 25, 9, 9, 9, 9, 9, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 30, 9, 9, 9, 38, 39, - 40, 41, 42, 43, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 44, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 45, - 22, 22, 22, 22, 46, 9, 9, 9, - 9, 9, 9, 9, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 47, - 48, 48, 48, 48, 48, 48, 48, 48, - 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, - 49, 22, 50, 51, 22, 52, 53, 54, - - - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 7, 26, 26, 26, 28, 26, 26, 26, - 22, 23, 26, 27, 26, 21, 26, 26, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 26, 26, 27, 27, 27, 26, - 26, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 22, 26, 23, 29, 20, - 29, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 22, 27, 23, 27, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 7, 26, 28, 28, 28, 28, 30, 30, - 29, 30, 16, 24, 27, 21, 30, 29, - 30, 27, 6, 6, 29, 16, 30, 26, - 29, 6, 16, 25, 6, 6, 6, 26, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 27, - 15, 15, 15, 15, 15, 15, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 27, - 16, 16, 16, 16, 16, 16, 16, 16, - - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 16, 15, 16, 15, 16, 15, 16, 15, - 16, 15, 16, 15, 16, 15, 16, 15, - 16, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 15, 16, 15, 16, 15, 16, 16, - 16, 15, 15, 16, 15, 16, 15, 15, - 16, 15, 15, 15, 16, 16, 15, 15, - 15, 15, 16, 15, 15, 16, 15, 15, - 15, 16, 16, 16, 15, 15, 16, 15, - 15, 16, 15, 16, 15, 16, 15, 15, - 16, 15, 16, 16, 15, 16, 15, 15, - 16, 15, 15, 15, 16, 15, 16, 15, - 15, 16, 16, 19, 15, 16, 16, 16, - 19, 19, 19, 19, 15, 17, 16, 15, - 17, 16, 15, 17, 16, 15, 16, 15, - 16, 15, 16, 15, 16, 15, 16, 15, - 16, 15, 16, 15, 16, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 16, 15, 17, 16, 15, 16, 15, 15, - 15, 16, 15, 16, 15, 16, 15, 16, - - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 0, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 0, 0, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 29, 29, 18, 18, 18, 18, 18, - 18, 18, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 18, 18, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 18, 18, 18, 18, 18, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 18, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 29, 29, 0, 0, - 0, 0, 18, 0, 0, 0, 26, 0, - 0, 0, 0, 0, 29, 29, 15, 26, - 15, 15, 15, 0, 15, 0, 15, 15, - 16, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 0, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 0, - 16, 16, 15, 15, 15, 16, 16, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 16, 16, 16, 16, 15, 16, 27, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 30, 1, 1, 1, 1, 0, - 3, 3, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 15, 16, 15, 16, 15, 16, 15, - 16, 15, 16, 15, 16, 15, 16, 0, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 0, 0, - 15, 16, 0, 0, 0, 0, 0, 0, - - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 0, - 0, 18, 26, 26, 26, 26, 26, 26, - 0, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 0, 26, 21, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 26, 1, - 26, 1, 1, 26, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 0, 0, 0, 0, 0, - 19, 19, 19, 26, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 26, 0, 0, 0, 26, - 0, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 0, 0, 0, 0, 0, - 18, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 26, 26, 26, 26, 19, 19, - 1, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 26, 19, 1, 1, - 1, 1, 1, 1, 1, 11, 3, 1, - 1, 1, 1, 1, 1, 18, 18, 1, - 1, 30, 1, 1, 1, 1, 0, 0, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 19, 19, 19, 30, 30, 0, - - 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 0, 11, - 19, 1, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 1, 1, 2, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 0, 0, 1, 19, 2, 2, - 2, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 1, 0, 0, - 19, 1, 1, 1, 1, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 1, 1, 26, 26, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 2, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 0, 19, - 19, 0, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 0, 0, 0, 19, 19, - 19, 19, 0, 0, 1, 0, 2, 2, - 2, 1, 1, 1, 1, 0, 0, 2, - 2, 0, 0, 2, 2, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 19, 19, 0, 19, - 19, 19, 1, 1, 0, 0, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 19, 19, 28, 28, 6, 6, 6, 6, - 6, 6, 30, 0, 0, 0, 0, 0, - - 0, 0, 1, 0, 0, 19, 19, 19, - 19, 19, 19, 0, 0, 0, 0, 19, - 19, 0, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 0, 19, 19, 0, - 19, 19, 0, 0, 1, 0, 2, 2, - 2, 1, 1, 0, 0, 0, 0, 1, - 1, 0, 0, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 19, 19, 19, 0, 19, 0, - 0, 0, 0, 0, 0, 0, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 1, 1, 19, 19, 19, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 2, 0, 19, 19, 19, - 19, 19, 19, 19, 0, 19, 0, 19, - 19, 19, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 0, 19, 19, 19, - 19, 19, 0, 0, 1, 19, 2, 2, - 2, 1, 1, 1, 1, 1, 0, 1, - 1, 2, 0, 2, 2, 1, 0, 0, - 19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 1, 2, 2, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 0, 19, - 19, 0, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 0, 0, 19, 19, - 19, 19, 0, 0, 1, 19, 2, 1, - 2, 1, 1, 1, 0, 0, 0, 2, - 2, 0, 0, 2, 2, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 2, - 0, 0, 0, 0, 19, 19, 0, 19, - 19, 19, 0, 0, 0, 0, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 30, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 19, 0, 19, 19, 19, - 19, 19, 19, 0, 0, 0, 19, 19, - 19, 0, 19, 19, 19, 19, 0, 0, - 0, 19, 19, 0, 19, 0, 19, 19, - 0, 0, 0, 19, 19, 0, 0, 0, - 19, 19, 19, 0, 0, 0, 19, 19, - 19, 19, 19, 19, 19, 19, 0, 19, - 19, 19, 0, 0, 0, 0, 2, 2, - 1, 2, 2, 0, 0, 0, 2, 2, - 2, 0, 2, 2, 2, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 6, 6, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 2, 2, 2, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 0, 19, 19, 19, - 19, 19, 0, 0, 0, 0, 1, 1, - 1, 2, 2, 2, 2, 0, 1, 1, - 1, 0, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 0, 0, 0, 0, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 2, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 0, 19, 19, 19, - 19, 19, 0, 0, 0, 0, 2, 1, - 2, 2, 2, 2, 2, 0, 1, 2, - 2, 0, 2, 2, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 0, - 0, 0, 0, 0, 0, 0, 19, 0, - 19, 19, 0, 0, 0, 0, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 2, 2, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 0, 0, 0, 0, 2, 2, - 2, 1, 1, 1, 0, 0, 2, 2, - 2, 0, 2, 2, 2, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 0, 0, 0, 0, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 2, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 0, 0, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 0, 19, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 0, - 0, 0, 1, 0, 0, 0, 0, 2, - 2, 2, 1, 1, 1, 0, 1, 0, - 2, 2, 2, 2, 2, 2, 2, 2, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 2, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 1, 19, 19, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 28, - 19, 19, 19, 19, 19, 19, 18, 1, - 1, 1, 1, 1, 1, 1, 1, 26, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 26, 26, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 19, 0, 19, 0, 0, 19, - 19, 0, 19, 0, 0, 19, 0, 0, - 0, 0, 0, 0, 19, 19, 19, 19, - 0, 19, 19, 19, 19, 19, 19, 19, - 0, 19, 19, 19, 0, 19, 0, 19, - 0, 0, 19, 19, 0, 19, 19, 19, - 19, 1, 19, 19, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 19, 0, 0, - 19, 19, 19, 19, 19, 0, 18, 0, - 1, 1, 1, 1, 1, 1, 0, 0, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 0, 0, 19, 19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 19, 30, 30, 30, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 30, 30, 30, 30, 30, - 1, 1, 30, 30, 30, 30, 30, 30, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 30, 1, 30, 1, - 30, 1, 22, 23, 22, 23, 2, 2, - 19, 19, 19, 19, 19, 19, 19, 19, - 0, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 26, 1, 1, - 19, 19, 19, 19, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 30, 30, - 30, 30, 30, 30, 30, 30, 1, 30, - 30, 30, 30, 30, 30, 0, 0, 30, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 0, 19, 19, 19, 19, 19, - 0, 19, 19, 0, 2, 1, 1, 1, - 1, 2, 1, 0, 0, 0, 1, 1, - 2, 1, 0, 0, 0, 0, 0, 0, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 26, 26, 26, 26, 26, 26, - 19, 19, 19, 19, 19, 19, 2, 2, - 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 0, 26, 0, 0, 0, 0, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 0, 0, 0, 0, 0, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 0, 0, 0, 0, 0, 0, - - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 0, 19, 19, 19, 19, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 0, 19, 19, 19, 19, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 0, 19, 19, 19, 19, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 0, 19, 19, 19, 19, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 0, 19, 19, 19, 19, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 0, 19, 19, 19, 19, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 0, 0, 0, 0, 0, - 0, 26, 26, 26, 26, 26, 26, 26, - 26, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 26, 26, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 7, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 22, 23, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 26, 26, 26, 5, 5, - 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 19, 19, - 19, 19, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 1, 1, 1, 26, 26, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 19, 19, - 19, 0, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 2, 2, 2, 1, - 1, 1, 1, 1, 1, 1, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, - 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 26, 26, 26, 18, - 26, 26, 26, 28, 19, 0, 0, 0, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 26, 26, 26, 26, 26, 26, 21, 26, - 26, 26, 26, 1, 1, 1, 11, 0, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 18, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 16, 16, - 16, 16, 16, 16, 0, 0, 0, 0, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 15, 16, 15, 16, 15, 16, - 15, 16, 0, 0, 0, 0, 0, 0, - - 16, 16, 16, 16, 16, 16, 16, 16, - 15, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 0, 0, - 15, 15, 15, 15, 15, 15, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 16, - 15, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 16, - 15, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 0, 0, - 15, 15, 15, 15, 15, 15, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 16, - 0, 15, 0, 15, 0, 15, 0, 15, - 16, 16, 16, 16, 16, 16, 16, 16, - 15, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, - 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, - 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, - 16, 16, 16, 16, 16, 0, 16, 16, - 15, 15, 15, 15, 17, 29, 16, 29, - 29, 29, 16, 16, 16, 0, 16, 16, - 15, 15, 15, 15, 17, 29, 29, 29, - 16, 16, 16, 16, 0, 0, 16, 16, - 15, 15, 15, 15, 0, 29, 29, 29, - 16, 16, 16, 16, 16, 16, 16, 16, - 15, 15, 15, 15, 15, 29, 29, 29, - 0, 0, 16, 16, 16, 0, 16, 16, - 15, 15, 15, 15, 17, 29, 29, 0, - - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 11, 11, 11, 11, - 21, 21, 21, 21, 21, 21, 26, 26, - 24, 25, 22, 24, 24, 25, 22, 24, - 26, 26, 26, 26, 26, 26, 26, 26, - 8, 9, 11, 11, 11, 11, 11, 7, - 26, 26, 26, 26, 26, 26, 26, 26, - 26, 24, 25, 26, 26, 26, 26, 20, - 20, 26, 26, 26, 27, 22, 23, 26, - 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 27, 0, 0, 0, 0, 26, - 0, 0, 0, 0, 0, 0, 0, 7, - 11, 11, 11, 11, 0, 0, 0, 0, - 0, 0, 11, 11, 11, 11, 11, 11, - 6, 16, 0, 0, 6, 6, 6, 6, - 6, 6, 27, 27, 27, 22, 23, 16, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 27, 27, 27, 22, 23, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 3, - 3, 1, 3, 3, 3, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 30, 30, 15, 30, 30, 30, 30, 15, - 30, 30, 16, 15, 15, 15, 16, 16, - 15, 15, 15, 16, 30, 15, 30, 30, - 30, 15, 15, 15, 15, 15, 30, 30, - 30, 30, 30, 30, 15, 30, 15, 30, - 15, 30, 15, 15, 15, 15, 30, 16, - 15, 15, 30, 15, 16, 19, 19, 19, - 19, 16, 30, 0, 0, 16, 15, 15, - 27, 27, 27, 27, 27, 15, 16, 16, - 16, 16, 30, 27, 0, 0, 0, 0, - 0, 0, 0, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 27, 27, 27, 27, 27, 30, 30, 30, - 30, 30, 27, 27, 30, 30, 30, 30, - 27, 30, 30, 27, 30, 30, 27, 30, - 30, 30, 30, 30, 30, 30, 27, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 27, 27, - 30, 30, 27, 30, 27, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - - 30, 30, 30, 30, 30, 30, 30, 30, - 27, 27, 27, 27, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 27, 27, 30, 30, 30, 30, 30, 30, - 30, 22, 23, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 27, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 22, 23, 26, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 0, - - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 27, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 27, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 27, 27, 27, 27, 27, 27, 27, 27, - - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 0, 0, 30, 30, - 0, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 27, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 0, 0, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 30, 30, 30, 30, 0, 30, 30, - 30, 30, 0, 0, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 0, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 0, 30, 0, 30, - 30, 30, 30, 0, 0, 0, 30, 0, - 30, 30, 30, 30, 30, 30, 30, 0, - 0, 30, 30, 30, 30, 30, 30, 30, - 22, 23, 22, 23, 22, 23, 22, 23, - 22, 23, 22, 23, 22, 23, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 30, 0, 0, 0, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 0, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 22, 23, - 22, 23, 22, 23, 0, 0, 0, 0, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 22, 23, 22, 23, 22, - 23, 22, 23, 22, 23, 22, 23, 22, - 23, 22, 23, 22, 23, 22, 23, 22, - 23, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 22, 23, 22, 23, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 22, 23, 27, 27, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 0, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 0, 0, 0, 0, - - 7, 26, 26, 26, 30, 18, 19, 5, - 22, 23, 22, 23, 22, 23, 22, 23, - 22, 23, 30, 30, 22, 23, 22, 23, - 22, 23, 22, 23, 21, 22, 23, 23, - 30, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 1, 1, 1, 1, 1, 1, - 21, 18, 18, 18, 18, 18, 30, 30, - 5, 5, 5, 18, 19, 26, 30, 30, - 0, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 0, 1, 1, 29, 29, 18, 18, 19, - 21, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 20, 18, 18, 18, 19, - - 0, 0, 0, 0, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 0, 0, - 0, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 30, 30, 6, 6, 6, 6, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 0, 0, 0, 30, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 0, 0, 0, 0, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 0, - - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 0, - 0, 0, 0, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 0, 0, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 0, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 0, 0, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 16, 16, 16, 16, 16, 16, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 16, 16, 16, 16, - 0, 0, 0, 0, 0, 19, 1, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 27, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 19, 19, 19, 19, 19, 0, 19, 0, - 19, 19, 0, 19, 19, 0, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 22, 23, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 0, 0, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 28, 0, 0, 0, - - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 26, 21, 21, 20, 20, 22, 23, 22, - 23, 22, 23, 22, 23, 22, 23, 22, - 23, 22, 23, 22, 23, 26, 26, 0, - 0, 26, 26, 26, 26, 20, 20, 20, - 26, 26, 26, 0, 26, 26, 26, 26, - 21, 22, 23, 22, 23, 22, 23, 26, - 26, 26, 27, 21, 27, 27, 27, 0, - 26, 28, 26, 26, 0, 0, 0, 0, - 19, 19, 19, 19, 19, 0, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 0, 0, 11, - - 0, 26, 26, 26, 28, 26, 26, 26, - 22, 23, 26, 27, 26, 21, 26, 26, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 26, 26, 27, 27, 27, 26, - 26, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 22, 26, 23, 29, 20, - 29, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 22, 27, 23, 27, 22, - 23, 26, 22, 23, 26, 20, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 18, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 18, 18, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, - 0, 0, 19, 19, 19, 19, 19, 19, - 0, 0, 19, 19, 19, 19, 19, 19, - 0, 0, 19, 19, 19, 19, 19, 19, - 0, 0, 19, 19, 19, 0, 0, 0, - 28, 28, 27, 29, 30, 28, 28, 0, - 30, 27, 27, 27, 27, 30, 30, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 11, 11, 30, 30, 0, 0, -}; - -// 14080 bytes - -const TQ_UINT16 TQUnicodeTables::decomposition_map[] = { - 0, - 3, 0x00A0, 0x0020, 0, - 16, 0x00A8, 0x0020, 0x0308, 0, - 9, 0x00AA, 0x0061, 0, - 16, 0x00AF, 0x0020, 0x0304, 0, - 9, 0x00B2, 0x0032, 0, - 9, 0x00B3, 0x0033, 0, - 16, 0x00B4, 0x0020, 0x0301, 0, - 16, 0x00B5, 0x03BC, 0, - 16, 0x00B8, 0x0020, 0x0327, 0, - 9, 0x00B9, 0x0031, 0, - 9, 0x00BA, 0x006F, 0, - 17, 0x00BC, 0x0031, 0x2044, 0x0034, 0, - 17, 0x00BD, 0x0031, 0x2044, 0x0032, 0, - 17, 0x00BE, 0x0033, 0x2044, 0x0034, 0, - 1, 0x00C0, 0x0041, 0x0300, 0, - 1, 0x00C1, 0x0041, 0x0301, 0, - 1, 0x00C2, 0x0041, 0x0302, 0, - 1, 0x00C3, 0x0041, 0x0303, 0, - 1, 0x00C4, 0x0041, 0x0308, 0, - 1, 0x00C5, 0x0041, 0x030A, 0, - 1, 0x00C7, 0x0043, 0x0327, 0, - 1, 0x00C8, 0x0045, 0x0300, 0, - 1, 0x00C9, 0x0045, 0x0301, 0, - 1, 0x00CA, 0x0045, 0x0302, 0, - 1, 0x00CB, 0x0045, 0x0308, 0, - 1, 0x00CC, 0x0049, 0x0300, 0, - 1, 0x00CD, 0x0049, 0x0301, 0, - 1, 0x00CE, 0x0049, 0x0302, 0, - 1, 0x00CF, 0x0049, 0x0308, 0, - 1, 0x00D1, 0x004E, 0x0303, 0, - 1, 0x00D2, 0x004F, 0x0300, 0, - 1, 0x00D3, 0x004F, 0x0301, 0, - 1, 0x00D4, 0x004F, 0x0302, 0, - 1, 0x00D5, 0x004F, 0x0303, 0, - 1, 0x00D6, 0x004F, 0x0308, 0, - 1, 0x00D9, 0x0055, 0x0300, 0, - 1, 0x00DA, 0x0055, 0x0301, 0, - 1, 0x00DB, 0x0055, 0x0302, 0, - 1, 0x00DC, 0x0055, 0x0308, 0, - 1, 0x00DD, 0x0059, 0x0301, 0, - 1, 0x00E0, 0x0061, 0x0300, 0, - 1, 0x00E1, 0x0061, 0x0301, 0, - 1, 0x00E2, 0x0061, 0x0302, 0, - 1, 0x00E3, 0x0061, 0x0303, 0, - 1, 0x00E4, 0x0061, 0x0308, 0, - 1, 0x00E5, 0x0061, 0x030A, 0, - 1, 0x00E7, 0x0063, 0x0327, 0, - 1, 0x00E8, 0x0065, 0x0300, 0, - 1, 0x00E9, 0x0065, 0x0301, 0, - 1, 0x00EA, 0x0065, 0x0302, 0, - 1, 0x00EB, 0x0065, 0x0308, 0, - 1, 0x00EC, 0x0069, 0x0300, 0, - 1, 0x00ED, 0x0069, 0x0301, 0, - 1, 0x00EE, 0x0069, 0x0302, 0, - 1, 0x00EF, 0x0069, 0x0308, 0, - 1, 0x00F1, 0x006E, 0x0303, 0, - 1, 0x00F2, 0x006F, 0x0300, 0, - 1, 0x00F3, 0x006F, 0x0301, 0, - 1, 0x00F4, 0x006F, 0x0302, 0, - 1, 0x00F5, 0x006F, 0x0303, 0, - 1, 0x00F6, 0x006F, 0x0308, 0, - 1, 0x00F9, 0x0075, 0x0300, 0, - 1, 0x00FA, 0x0075, 0x0301, 0, - 1, 0x00FB, 0x0075, 0x0302, 0, - 1, 0x00FC, 0x0075, 0x0308, 0, - 1, 0x00FD, 0x0079, 0x0301, 0, - 1, 0x00FF, 0x0079, 0x0308, 0, - 1, 0x0100, 0x0041, 0x0304, 0, - 1, 0x0101, 0x0061, 0x0304, 0, - 1, 0x0102, 0x0041, 0x0306, 0, - 1, 0x0103, 0x0061, 0x0306, 0, - 1, 0x0104, 0x0041, 0x0328, 0, - 1, 0x0105, 0x0061, 0x0328, 0, - 1, 0x0106, 0x0043, 0x0301, 0, - 1, 0x0107, 0x0063, 0x0301, 0, - 1, 0x0108, 0x0043, 0x0302, 0, - 1, 0x0109, 0x0063, 0x0302, 0, - 1, 0x010A, 0x0043, 0x0307, 0, - 1, 0x010B, 0x0063, 0x0307, 0, - 1, 0x010C, 0x0043, 0x030C, 0, - 1, 0x010D, 0x0063, 0x030C, 0, - 1, 0x010E, 0x0044, 0x030C, 0, - 1, 0x010F, 0x0064, 0x030C, 0, - 1, 0x0112, 0x0045, 0x0304, 0, - 1, 0x0113, 0x0065, 0x0304, 0, - 1, 0x0114, 0x0045, 0x0306, 0, - 1, 0x0115, 0x0065, 0x0306, 0, - 1, 0x0116, 0x0045, 0x0307, 0, - 1, 0x0117, 0x0065, 0x0307, 0, - 1, 0x0118, 0x0045, 0x0328, 0, - 1, 0x0119, 0x0065, 0x0328, 0, - 1, 0x011A, 0x0045, 0x030C, 0, - 1, 0x011B, 0x0065, 0x030C, 0, - 1, 0x011C, 0x0047, 0x0302, 0, - 1, 0x011D, 0x0067, 0x0302, 0, - 1, 0x011E, 0x0047, 0x0306, 0, - 1, 0x011F, 0x0067, 0x0306, 0, - 1, 0x0120, 0x0047, 0x0307, 0, - 1, 0x0121, 0x0067, 0x0307, 0, - 1, 0x0122, 0x0047, 0x0327, 0, - 1, 0x0123, 0x0067, 0x0327, 0, - 1, 0x0124, 0x0048, 0x0302, 0, - 1, 0x0125, 0x0068, 0x0302, 0, - 1, 0x0128, 0x0049, 0x0303, 0, - 1, 0x0129, 0x0069, 0x0303, 0, - 1, 0x012A, 0x0049, 0x0304, 0, - 1, 0x012B, 0x0069, 0x0304, 0, - 1, 0x012C, 0x0049, 0x0306, 0, - 1, 0x012D, 0x0069, 0x0306, 0, - 1, 0x012E, 0x0049, 0x0328, 0, - 1, 0x012F, 0x0069, 0x0328, 0, - 1, 0x0130, 0x0049, 0x0307, 0, - 16, 0x0132, 0x0049, 0x004A, 0, - 16, 0x0133, 0x0069, 0x006A, 0, - 1, 0x0134, 0x004A, 0x0302, 0, - 1, 0x0135, 0x006A, 0x0302, 0, - 1, 0x0136, 0x004B, 0x0327, 0, - 1, 0x0137, 0x006B, 0x0327, 0, - 1, 0x0139, 0x004C, 0x0301, 0, - 1, 0x013A, 0x006C, 0x0301, 0, - 1, 0x013B, 0x004C, 0x0327, 0, - 1, 0x013C, 0x006C, 0x0327, 0, - 1, 0x013D, 0x004C, 0x030C, 0, - 1, 0x013E, 0x006C, 0x030C, 0, - 16, 0x013F, 0x004C, 0x00B7, 0, - 16, 0x0140, 0x006C, 0x00B7, 0, - 1, 0x0143, 0x004E, 0x0301, 0, - 1, 0x0144, 0x006E, 0x0301, 0, - 1, 0x0145, 0x004E, 0x0327, 0, - 1, 0x0146, 0x006E, 0x0327, 0, - 1, 0x0147, 0x004E, 0x030C, 0, - 1, 0x0148, 0x006E, 0x030C, 0, - 16, 0x0149, 0x02BC, 0x006E, 0, - 1, 0x014C, 0x004F, 0x0304, 0, - 1, 0x014D, 0x006F, 0x0304, 0, - 1, 0x014E, 0x004F, 0x0306, 0, - 1, 0x014F, 0x006F, 0x0306, 0, - 1, 0x0150, 0x004F, 0x030B, 0, - 1, 0x0151, 0x006F, 0x030B, 0, - 1, 0x0154, 0x0052, 0x0301, 0, - 1, 0x0155, 0x0072, 0x0301, 0, - 1, 0x0156, 0x0052, 0x0327, 0, - 1, 0x0157, 0x0072, 0x0327, 0, - 1, 0x0158, 0x0052, 0x030C, 0, - 1, 0x0159, 0x0072, 0x030C, 0, - 1, 0x015A, 0x0053, 0x0301, 0, - 1, 0x015B, 0x0073, 0x0301, 0, - 1, 0x015C, 0x0053, 0x0302, 0, - 1, 0x015D, 0x0073, 0x0302, 0, - 1, 0x015E, 0x0053, 0x0327, 0, - 1, 0x015F, 0x0073, 0x0327, 0, - 1, 0x0160, 0x0053, 0x030C, 0, - 1, 0x0161, 0x0073, 0x030C, 0, - 1, 0x0162, 0x0054, 0x0327, 0, - 1, 0x0163, 0x0074, 0x0327, 0, - 1, 0x0164, 0x0054, 0x030C, 0, - 1, 0x0165, 0x0074, 0x030C, 0, - 1, 0x0168, 0x0055, 0x0303, 0, - 1, 0x0169, 0x0075, 0x0303, 0, - 1, 0x016A, 0x0055, 0x0304, 0, - 1, 0x016B, 0x0075, 0x0304, 0, - 1, 0x016C, 0x0055, 0x0306, 0, - 1, 0x016D, 0x0075, 0x0306, 0, - 1, 0x016E, 0x0055, 0x030A, 0, - 1, 0x016F, 0x0075, 0x030A, 0, - 1, 0x0170, 0x0055, 0x030B, 0, - 1, 0x0171, 0x0075, 0x030B, 0, - 1, 0x0172, 0x0055, 0x0328, 0, - 1, 0x0173, 0x0075, 0x0328, 0, - 1, 0x0174, 0x0057, 0x0302, 0, - 1, 0x0175, 0x0077, 0x0302, 0, - 1, 0x0176, 0x0059, 0x0302, 0, - 1, 0x0177, 0x0079, 0x0302, 0, - 1, 0x0178, 0x0059, 0x0308, 0, - 1, 0x0179, 0x005A, 0x0301, 0, - 1, 0x017A, 0x007A, 0x0301, 0, - 1, 0x017B, 0x005A, 0x0307, 0, - 1, 0x017C, 0x007A, 0x0307, 0, - 1, 0x017D, 0x005A, 0x030C, 0, - 1, 0x017E, 0x007A, 0x030C, 0, - 16, 0x017F, 0x0073, 0, - 1, 0x01A0, 0x004F, 0x031B, 0, - 1, 0x01A1, 0x006F, 0x031B, 0, - 1, 0x01AF, 0x0055, 0x031B, 0, - 1, 0x01B0, 0x0075, 0x031B, 0, - 16, 0x01C4, 0x0044, 0x017D, 0, - 16, 0x01C5, 0x0044, 0x017E, 0, - 16, 0x01C6, 0x0064, 0x017E, 0, - 16, 0x01C7, 0x004C, 0x004A, 0, - 16, 0x01C8, 0x004C, 0x006A, 0, - 16, 0x01C9, 0x006C, 0x006A, 0, - 16, 0x01CA, 0x004E, 0x004A, 0, - 16, 0x01CB, 0x004E, 0x006A, 0, - 16, 0x01CC, 0x006E, 0x006A, 0, - 1, 0x01CD, 0x0041, 0x030C, 0, - 1, 0x01CE, 0x0061, 0x030C, 0, - 1, 0x01CF, 0x0049, 0x030C, 0, - 1, 0x01D0, 0x0069, 0x030C, 0, - 1, 0x01D1, 0x004F, 0x030C, 0, - 1, 0x01D2, 0x006F, 0x030C, 0, - 1, 0x01D3, 0x0055, 0x030C, 0, - 1, 0x01D4, 0x0075, 0x030C, 0, - 1, 0x01D5, 0x00DC, 0x0304, 0, - 1, 0x01D6, 0x00FC, 0x0304, 0, - 1, 0x01D7, 0x00DC, 0x0301, 0, - 1, 0x01D8, 0x00FC, 0x0301, 0, - 1, 0x01D9, 0x00DC, 0x030C, 0, - 1, 0x01DA, 0x00FC, 0x030C, 0, - 1, 0x01DB, 0x00DC, 0x0300, 0, - 1, 0x01DC, 0x00FC, 0x0300, 0, - 1, 0x01DE, 0x00C4, 0x0304, 0, - 1, 0x01DF, 0x00E4, 0x0304, 0, - 1, 0x01E0, 0x0226, 0x0304, 0, - 1, 0x01E1, 0x0227, 0x0304, 0, - 1, 0x01E2, 0x00C6, 0x0304, 0, - 1, 0x01E3, 0x00E6, 0x0304, 0, - 1, 0x01E6, 0x0047, 0x030C, 0, - 1, 0x01E7, 0x0067, 0x030C, 0, - 1, 0x01E8, 0x004B, 0x030C, 0, - 1, 0x01E9, 0x006B, 0x030C, 0, - 1, 0x01EA, 0x004F, 0x0328, 0, - 1, 0x01EB, 0x006F, 0x0328, 0, - 1, 0x01EC, 0x01EA, 0x0304, 0, - 1, 0x01ED, 0x01EB, 0x0304, 0, - 1, 0x01EE, 0x01B7, 0x030C, 0, - 1, 0x01EF, 0x0292, 0x030C, 0, - 1, 0x01F0, 0x006A, 0x030C, 0, - 16, 0x01F1, 0x0044, 0x005A, 0, - 16, 0x01F2, 0x0044, 0x007A, 0, - 16, 0x01F3, 0x0064, 0x007A, 0, - 1, 0x01F4, 0x0047, 0x0301, 0, - 1, 0x01F5, 0x0067, 0x0301, 0, - 1, 0x01F8, 0x004E, 0x0300, 0, - 1, 0x01F9, 0x006E, 0x0300, 0, - 1, 0x01FA, 0x00C5, 0x0301, 0, - 1, 0x01FB, 0x00E5, 0x0301, 0, - 1, 0x01FC, 0x00C6, 0x0301, 0, - 1, 0x01FD, 0x00E6, 0x0301, 0, - 1, 0x01FE, 0x00D8, 0x0301, 0, - 1, 0x01FF, 0x00F8, 0x0301, 0, - 1, 0x0200, 0x0041, 0x030F, 0, - 1, 0x0201, 0x0061, 0x030F, 0, - 1, 0x0202, 0x0041, 0x0311, 0, - 1, 0x0203, 0x0061, 0x0311, 0, - 1, 0x0204, 0x0045, 0x030F, 0, - 1, 0x0205, 0x0065, 0x030F, 0, - 1, 0x0206, 0x0045, 0x0311, 0, - 1, 0x0207, 0x0065, 0x0311, 0, - 1, 0x0208, 0x0049, 0x030F, 0, - 1, 0x0209, 0x0069, 0x030F, 0, - 1, 0x020A, 0x0049, 0x0311, 0, - 1, 0x020B, 0x0069, 0x0311, 0, - 1, 0x020C, 0x004F, 0x030F, 0, - 1, 0x020D, 0x006F, 0x030F, 0, - 1, 0x020E, 0x004F, 0x0311, 0, - 1, 0x020F, 0x006F, 0x0311, 0, - 1, 0x0210, 0x0052, 0x030F, 0, - 1, 0x0211, 0x0072, 0x030F, 0, - 1, 0x0212, 0x0052, 0x0311, 0, - 1, 0x0213, 0x0072, 0x0311, 0, - 1, 0x0214, 0x0055, 0x030F, 0, - 1, 0x0215, 0x0075, 0x030F, 0, - 1, 0x0216, 0x0055, 0x0311, 0, - 1, 0x0217, 0x0075, 0x0311, 0, - 1, 0x0218, 0x0053, 0x0326, 0, - 1, 0x0219, 0x0073, 0x0326, 0, - 1, 0x021A, 0x0054, 0x0326, 0, - 1, 0x021B, 0x0074, 0x0326, 0, - 1, 0x021E, 0x0048, 0x030C, 0, - 1, 0x021F, 0x0068, 0x030C, 0, - 1, 0x0226, 0x0041, 0x0307, 0, - 1, 0x0227, 0x0061, 0x0307, 0, - 1, 0x0228, 0x0045, 0x0327, 0, - 1, 0x0229, 0x0065, 0x0327, 0, - 1, 0x022A, 0x00D6, 0x0304, 0, - 1, 0x022B, 0x00F6, 0x0304, 0, - 1, 0x022C, 0x00D5, 0x0304, 0, - 1, 0x022D, 0x00F5, 0x0304, 0, - 1, 0x022E, 0x004F, 0x0307, 0, - 1, 0x022F, 0x006F, 0x0307, 0, - 1, 0x0230, 0x022E, 0x0304, 0, - 1, 0x0231, 0x022F, 0x0304, 0, - 1, 0x0232, 0x0059, 0x0304, 0, - 1, 0x0233, 0x0079, 0x0304, 0, - 9, 0x02B0, 0x0068, 0, - 9, 0x02B1, 0x0266, 0, - 9, 0x02B2, 0x006A, 0, - 9, 0x02B3, 0x0072, 0, - 9, 0x02B4, 0x0279, 0, - 9, 0x02B5, 0x027B, 0, - 9, 0x02B6, 0x0281, 0, - 9, 0x02B7, 0x0077, 0, - 9, 0x02B8, 0x0079, 0, - 16, 0x02D8, 0x0020, 0x0306, 0, - 16, 0x02D9, 0x0020, 0x0307, 0, - 16, 0x02DA, 0x0020, 0x030A, 0, - 16, 0x02DB, 0x0020, 0x0328, 0, - 16, 0x02DC, 0x0020, 0x0303, 0, - 16, 0x02DD, 0x0020, 0x030B, 0, - 9, 0x02E0, 0x0263, 0, - 9, 0x02E1, 0x006C, 0, - 9, 0x02E2, 0x0073, 0, - 9, 0x02E3, 0x0078, 0, - 9, 0x02E4, 0x0295, 0, - 1, 0x0340, 0x0300, 0, - 1, 0x0341, 0x0301, 0, - 1, 0x0343, 0x0313, 0, - 1, 0x0344, 0x0308, 0x0301, 0, - 1, 0x0374, 0x02B9, 0, - 16, 0x037A, 0x0020, 0x0345, 0, - 1, 0x037E, 0x003B, 0, - 16, 0x0384, 0x0020, 0x0301, 0, - 1, 0x0385, 0x00A8, 0x0301, 0, - 1, 0x0386, 0x0391, 0x0301, 0, - 1, 0x0387, 0x00B7, 0, - 1, 0x0388, 0x0395, 0x0301, 0, - 1, 0x0389, 0x0397, 0x0301, 0, - 1, 0x038A, 0x0399, 0x0301, 0, - 1, 0x038C, 0x039F, 0x0301, 0, - 1, 0x038E, 0x03A5, 0x0301, 0, - 1, 0x038F, 0x03A9, 0x0301, 0, - 1, 0x0390, 0x03CA, 0x0301, 0, - 1, 0x03AA, 0x0399, 0x0308, 0, - 1, 0x03AB, 0x03A5, 0x0308, 0, - 1, 0x03AC, 0x03B1, 0x0301, 0, - 1, 0x03AD, 0x03B5, 0x0301, 0, - 1, 0x03AE, 0x03B7, 0x0301, 0, - 1, 0x03AF, 0x03B9, 0x0301, 0, - 1, 0x03B0, 0x03CB, 0x0301, 0, - 1, 0x03CA, 0x03B9, 0x0308, 0, - 1, 0x03CB, 0x03C5, 0x0308, 0, - 1, 0x03CC, 0x03BF, 0x0301, 0, - 1, 0x03CD, 0x03C5, 0x0301, 0, - 1, 0x03CE, 0x03C9, 0x0301, 0, - 16, 0x03D0, 0x03B2, 0, - 16, 0x03D1, 0x03B8, 0, - 16, 0x03D2, 0x03A5, 0, - 1, 0x03D3, 0x03D2, 0x0301, 0, - 1, 0x03D4, 0x03D2, 0x0308, 0, - 16, 0x03D5, 0x03C6, 0, - 16, 0x03D6, 0x03C0, 0, - 16, 0x03F0, 0x03BA, 0, - 16, 0x03F1, 0x03C1, 0, - 16, 0x03F2, 0x03C2, 0, - 16, 0x03F4, 0x0398, 0, - 16, 0x03F5, 0x03B5, 0, - 1, 0x0400, 0x0415, 0x0300, 0, - 1, 0x0401, 0x0415, 0x0308, 0, - 1, 0x0403, 0x0413, 0x0301, 0, - 1, 0x0407, 0x0406, 0x0308, 0, - 1, 0x040C, 0x041A, 0x0301, 0, - 1, 0x040D, 0x0418, 0x0300, 0, - 1, 0x040E, 0x0423, 0x0306, 0, - 1, 0x0419, 0x0418, 0x0306, 0, - 1, 0x0439, 0x0438, 0x0306, 0, - 1, 0x0450, 0x0435, 0x0300, 0, - 1, 0x0451, 0x0435, 0x0308, 0, - 1, 0x0453, 0x0433, 0x0301, 0, - 1, 0x0457, 0x0456, 0x0308, 0, - 1, 0x045C, 0x043A, 0x0301, 0, - 1, 0x045D, 0x0438, 0x0300, 0, - 1, 0x045E, 0x0443, 0x0306, 0, - 1, 0x0476, 0x0474, 0x030F, 0, - 1, 0x0477, 0x0475, 0x030F, 0, - 1, 0x04C1, 0x0416, 0x0306, 0, - 1, 0x04C2, 0x0436, 0x0306, 0, - 1, 0x04D0, 0x0410, 0x0306, 0, - 1, 0x04D1, 0x0430, 0x0306, 0, - 1, 0x04D2, 0x0410, 0x0308, 0, - 1, 0x04D3, 0x0430, 0x0308, 0, - 1, 0x04D6, 0x0415, 0x0306, 0, - 1, 0x04D7, 0x0435, 0x0306, 0, - 1, 0x04DA, 0x04D8, 0x0308, 0, - 1, 0x04DB, 0x04D9, 0x0308, 0, - 1, 0x04DC, 0x0416, 0x0308, 0, - 1, 0x04DD, 0x0436, 0x0308, 0, - 1, 0x04DE, 0x0417, 0x0308, 0, - 1, 0x04DF, 0x0437, 0x0308, 0, - 1, 0x04E2, 0x0418, 0x0304, 0, - 1, 0x04E3, 0x0438, 0x0304, 0, - 1, 0x04E4, 0x0418, 0x0308, 0, - 1, 0x04E5, 0x0438, 0x0308, 0, - 1, 0x04E6, 0x041E, 0x0308, 0, - 1, 0x04E7, 0x043E, 0x0308, 0, - 1, 0x04EA, 0x04E8, 0x0308, 0, - 1, 0x04EB, 0x04E9, 0x0308, 0, - 1, 0x04EC, 0x042D, 0x0308, 0, - 1, 0x04ED, 0x044D, 0x0308, 0, - 1, 0x04EE, 0x0423, 0x0304, 0, - 1, 0x04EF, 0x0443, 0x0304, 0, - 1, 0x04F0, 0x0423, 0x0308, 0, - 1, 0x04F1, 0x0443, 0x0308, 0, - 1, 0x04F2, 0x0423, 0x030B, 0, - 1, 0x04F3, 0x0443, 0x030B, 0, - 1, 0x04F4, 0x0427, 0x0308, 0, - 1, 0x04F5, 0x0447, 0x0308, 0, - 1, 0x04F8, 0x042B, 0x0308, 0, - 1, 0x04F9, 0x044B, 0x0308, 0, - 16, 0x0587, 0x0565, 0x0582, 0, - 1, 0x0622, 0x0627, 0x0653, 0, - 1, 0x0623, 0x0627, 0x0654, 0, - 1, 0x0624, 0x0648, 0x0654, 0, - 1, 0x0625, 0x0627, 0x0655, 0, - 1, 0x0626, 0x064A, 0x0654, 0, - 16, 0x0675, 0x0627, 0x0674, 0, - 16, 0x0676, 0x0648, 0x0674, 0, - 16, 0x0677, 0x06C7, 0x0674, 0, - 16, 0x0678, 0x064A, 0x0674, 0, - 1, 0x06C0, 0x06D5, 0x0654, 0, - 1, 0x06C2, 0x06C1, 0x0654, 0, - 1, 0x06D3, 0x06D2, 0x0654, 0, - 1, 0x0929, 0x0928, 0x093C, 0, - 1, 0x0931, 0x0930, 0x093C, 0, - 1, 0x0934, 0x0933, 0x093C, 0, - 1, 0x0958, 0x0915, 0x093C, 0, - 1, 0x0959, 0x0916, 0x093C, 0, - 1, 0x095A, 0x0917, 0x093C, 0, - 1, 0x095B, 0x091C, 0x093C, 0, - 1, 0x095C, 0x0921, 0x093C, 0, - 1, 0x095D, 0x0922, 0x093C, 0, - 1, 0x095E, 0x092B, 0x093C, 0, - 1, 0x095F, 0x092F, 0x093C, 0, - 1, 0x09CB, 0x09C7, 0x09BE, 0, - 1, 0x09CC, 0x09C7, 0x09D7, 0, - 1, 0x09DC, 0x09A1, 0x09BC, 0, - 1, 0x09DD, 0x09A2, 0x09BC, 0, - 1, 0x09DF, 0x09AF, 0x09BC, 0, - 1, 0x0A33, 0x0A32, 0x0A3C, 0, - 1, 0x0A36, 0x0A38, 0x0A3C, 0, - 1, 0x0A59, 0x0A16, 0x0A3C, 0, - 1, 0x0A5A, 0x0A17, 0x0A3C, 0, - 1, 0x0A5B, 0x0A1C, 0x0A3C, 0, - 1, 0x0A5E, 0x0A2B, 0x0A3C, 0, - 1, 0x0B48, 0x0B47, 0x0B56, 0, - 1, 0x0B4B, 0x0B47, 0x0B3E, 0, - 1, 0x0B4C, 0x0B47, 0x0B57, 0, - 1, 0x0B5C, 0x0B21, 0x0B3C, 0, - 1, 0x0B5D, 0x0B22, 0x0B3C, 0, - 1, 0x0B94, 0x0B92, 0x0BD7, 0, - 1, 0x0BCA, 0x0BC6, 0x0BBE, 0, - 1, 0x0BCB, 0x0BC7, 0x0BBE, 0, - 1, 0x0BCC, 0x0BC6, 0x0BD7, 0, - 1, 0x0C48, 0x0C46, 0x0C56, 0, - 1, 0x0CC0, 0x0CBF, 0x0CD5, 0, - 1, 0x0CC7, 0x0CC6, 0x0CD5, 0, - 1, 0x0CC8, 0x0CC6, 0x0CD6, 0, - 1, 0x0CCA, 0x0CC6, 0x0CC2, 0, - 1, 0x0CCB, 0x0CCA, 0x0CD5, 0, - 1, 0x0D4A, 0x0D46, 0x0D3E, 0, - 1, 0x0D4B, 0x0D47, 0x0D3E, 0, - 1, 0x0D4C, 0x0D46, 0x0D57, 0, - 1, 0x0DDA, 0x0DD9, 0x0DCA, 0, - 1, 0x0DDC, 0x0DD9, 0x0DCF, 0, - 1, 0x0DDD, 0x0DDC, 0x0DCA, 0, - 1, 0x0DDE, 0x0DD9, 0x0DDF, 0, - 16, 0x0E33, 0x0E4D, 0x0E32, 0, - 16, 0x0EB3, 0x0ECD, 0x0EB2, 0, - 16, 0x0EDC, 0x0EAB, 0x0E99, 0, - 16, 0x0EDD, 0x0EAB, 0x0EA1, 0, - 3, 0x0F0C, 0x0F0B, 0, - 1, 0x0F43, 0x0F42, 0x0FB7, 0, - 1, 0x0F4D, 0x0F4C, 0x0FB7, 0, - 1, 0x0F52, 0x0F51, 0x0FB7, 0, - 1, 0x0F57, 0x0F56, 0x0FB7, 0, - 1, 0x0F5C, 0x0F5B, 0x0FB7, 0, - 1, 0x0F69, 0x0F40, 0x0FB5, 0, - 1, 0x0F73, 0x0F71, 0x0F72, 0, - 1, 0x0F75, 0x0F71, 0x0F74, 0, - 1, 0x0F76, 0x0FB2, 0x0F80, 0, - 16, 0x0F77, 0x0FB2, 0x0F81, 0, - 1, 0x0F78, 0x0FB3, 0x0F80, 0, - 16, 0x0F79, 0x0FB3, 0x0F81, 0, - 1, 0x0F81, 0x0F71, 0x0F80, 0, - 1, 0x0F93, 0x0F92, 0x0FB7, 0, - 1, 0x0F9D, 0x0F9C, 0x0FB7, 0, - 1, 0x0FA2, 0x0FA1, 0x0FB7, 0, - 1, 0x0FA7, 0x0FA6, 0x0FB7, 0, - 1, 0x0FAC, 0x0FAB, 0x0FB7, 0, - 1, 0x0FB9, 0x0F90, 0x0FB5, 0, - 1, 0x1026, 0x1025, 0x102E, 0, - 1, 0x1E00, 0x0041, 0x0325, 0, - 1, 0x1E01, 0x0061, 0x0325, 0, - 1, 0x1E02, 0x0042, 0x0307, 0, - 1, 0x1E03, 0x0062, 0x0307, 0, - 1, 0x1E04, 0x0042, 0x0323, 0, - 1, 0x1E05, 0x0062, 0x0323, 0, - 1, 0x1E06, 0x0042, 0x0331, 0, - 1, 0x1E07, 0x0062, 0x0331, 0, - 1, 0x1E08, 0x00C7, 0x0301, 0, - 1, 0x1E09, 0x00E7, 0x0301, 0, - 1, 0x1E0A, 0x0044, 0x0307, 0, - 1, 0x1E0B, 0x0064, 0x0307, 0, - 1, 0x1E0C, 0x0044, 0x0323, 0, - 1, 0x1E0D, 0x0064, 0x0323, 0, - 1, 0x1E0E, 0x0044, 0x0331, 0, - 1, 0x1E0F, 0x0064, 0x0331, 0, - 1, 0x1E10, 0x0044, 0x0327, 0, - 1, 0x1E11, 0x0064, 0x0327, 0, - 1, 0x1E12, 0x0044, 0x032D, 0, - 1, 0x1E13, 0x0064, 0x032D, 0, - 1, 0x1E14, 0x0112, 0x0300, 0, - 1, 0x1E15, 0x0113, 0x0300, 0, - 1, 0x1E16, 0x0112, 0x0301, 0, - 1, 0x1E17, 0x0113, 0x0301, 0, - 1, 0x1E18, 0x0045, 0x032D, 0, - 1, 0x1E19, 0x0065, 0x032D, 0, - 1, 0x1E1A, 0x0045, 0x0330, 0, - 1, 0x1E1B, 0x0065, 0x0330, 0, - 1, 0x1E1C, 0x0228, 0x0306, 0, - 1, 0x1E1D, 0x0229, 0x0306, 0, - 1, 0x1E1E, 0x0046, 0x0307, 0, - 1, 0x1E1F, 0x0066, 0x0307, 0, - 1, 0x1E20, 0x0047, 0x0304, 0, - 1, 0x1E21, 0x0067, 0x0304, 0, - 1, 0x1E22, 0x0048, 0x0307, 0, - 1, 0x1E23, 0x0068, 0x0307, 0, - 1, 0x1E24, 0x0048, 0x0323, 0, - 1, 0x1E25, 0x0068, 0x0323, 0, - 1, 0x1E26, 0x0048, 0x0308, 0, - 1, 0x1E27, 0x0068, 0x0308, 0, - 1, 0x1E28, 0x0048, 0x0327, 0, - 1, 0x1E29, 0x0068, 0x0327, 0, - 1, 0x1E2A, 0x0048, 0x032E, 0, - 1, 0x1E2B, 0x0068, 0x032E, 0, - 1, 0x1E2C, 0x0049, 0x0330, 0, - 1, 0x1E2D, 0x0069, 0x0330, 0, - 1, 0x1E2E, 0x00CF, 0x0301, 0, - 1, 0x1E2F, 0x00EF, 0x0301, 0, - 1, 0x1E30, 0x004B, 0x0301, 0, - 1, 0x1E31, 0x006B, 0x0301, 0, - 1, 0x1E32, 0x004B, 0x0323, 0, - 1, 0x1E33, 0x006B, 0x0323, 0, - 1, 0x1E34, 0x004B, 0x0331, 0, - 1, 0x1E35, 0x006B, 0x0331, 0, - 1, 0x1E36, 0x004C, 0x0323, 0, - 1, 0x1E37, 0x006C, 0x0323, 0, - 1, 0x1E38, 0x1E36, 0x0304, 0, - 1, 0x1E39, 0x1E37, 0x0304, 0, - 1, 0x1E3A, 0x004C, 0x0331, 0, - 1, 0x1E3B, 0x006C, 0x0331, 0, - 1, 0x1E3C, 0x004C, 0x032D, 0, - 1, 0x1E3D, 0x006C, 0x032D, 0, - 1, 0x1E3E, 0x004D, 0x0301, 0, - 1, 0x1E3F, 0x006D, 0x0301, 0, - 1, 0x1E40, 0x004D, 0x0307, 0, - 1, 0x1E41, 0x006D, 0x0307, 0, - 1, 0x1E42, 0x004D, 0x0323, 0, - 1, 0x1E43, 0x006D, 0x0323, 0, - 1, 0x1E44, 0x004E, 0x0307, 0, - 1, 0x1E45, 0x006E, 0x0307, 0, - 1, 0x1E46, 0x004E, 0x0323, 0, - 1, 0x1E47, 0x006E, 0x0323, 0, - 1, 0x1E48, 0x004E, 0x0331, 0, - 1, 0x1E49, 0x006E, 0x0331, 0, - 1, 0x1E4A, 0x004E, 0x032D, 0, - 1, 0x1E4B, 0x006E, 0x032D, 0, - 1, 0x1E4C, 0x00D5, 0x0301, 0, - 1, 0x1E4D, 0x00F5, 0x0301, 0, - 1, 0x1E4E, 0x00D5, 0x0308, 0, - 1, 0x1E4F, 0x00F5, 0x0308, 0, - 1, 0x1E50, 0x014C, 0x0300, 0, - 1, 0x1E51, 0x014D, 0x0300, 0, - 1, 0x1E52, 0x014C, 0x0301, 0, - 1, 0x1E53, 0x014D, 0x0301, 0, - 1, 0x1E54, 0x0050, 0x0301, 0, - 1, 0x1E55, 0x0070, 0x0301, 0, - 1, 0x1E56, 0x0050, 0x0307, 0, - 1, 0x1E57, 0x0070, 0x0307, 0, - 1, 0x1E58, 0x0052, 0x0307, 0, - 1, 0x1E59, 0x0072, 0x0307, 0, - 1, 0x1E5A, 0x0052, 0x0323, 0, - 1, 0x1E5B, 0x0072, 0x0323, 0, - 1, 0x1E5C, 0x1E5A, 0x0304, 0, - 1, 0x1E5D, 0x1E5B, 0x0304, 0, - 1, 0x1E5E, 0x0052, 0x0331, 0, - 1, 0x1E5F, 0x0072, 0x0331, 0, - 1, 0x1E60, 0x0053, 0x0307, 0, - 1, 0x1E61, 0x0073, 0x0307, 0, - 1, 0x1E62, 0x0053, 0x0323, 0, - 1, 0x1E63, 0x0073, 0x0323, 0, - 1, 0x1E64, 0x015A, 0x0307, 0, - 1, 0x1E65, 0x015B, 0x0307, 0, - 1, 0x1E66, 0x0160, 0x0307, 0, - 1, 0x1E67, 0x0161, 0x0307, 0, - 1, 0x1E68, 0x1E62, 0x0307, 0, - 1, 0x1E69, 0x1E63, 0x0307, 0, - 1, 0x1E6A, 0x0054, 0x0307, 0, - 1, 0x1E6B, 0x0074, 0x0307, 0, - 1, 0x1E6C, 0x0054, 0x0323, 0, - 1, 0x1E6D, 0x0074, 0x0323, 0, - 1, 0x1E6E, 0x0054, 0x0331, 0, - 1, 0x1E6F, 0x0074, 0x0331, 0, - 1, 0x1E70, 0x0054, 0x032D, 0, - 1, 0x1E71, 0x0074, 0x032D, 0, - 1, 0x1E72, 0x0055, 0x0324, 0, - 1, 0x1E73, 0x0075, 0x0324, 0, - 1, 0x1E74, 0x0055, 0x0330, 0, - 1, 0x1E75, 0x0075, 0x0330, 0, - 1, 0x1E76, 0x0055, 0x032D, 0, - 1, 0x1E77, 0x0075, 0x032D, 0, - 1, 0x1E78, 0x0168, 0x0301, 0, - 1, 0x1E79, 0x0169, 0x0301, 0, - 1, 0x1E7A, 0x016A, 0x0308, 0, - 1, 0x1E7B, 0x016B, 0x0308, 0, - 1, 0x1E7C, 0x0056, 0x0303, 0, - 1, 0x1E7D, 0x0076, 0x0303, 0, - 1, 0x1E7E, 0x0056, 0x0323, 0, - 1, 0x1E7F, 0x0076, 0x0323, 0, - 1, 0x1E80, 0x0057, 0x0300, 0, - 1, 0x1E81, 0x0077, 0x0300, 0, - 1, 0x1E82, 0x0057, 0x0301, 0, - 1, 0x1E83, 0x0077, 0x0301, 0, - 1, 0x1E84, 0x0057, 0x0308, 0, - 1, 0x1E85, 0x0077, 0x0308, 0, - 1, 0x1E86, 0x0057, 0x0307, 0, - 1, 0x1E87, 0x0077, 0x0307, 0, - 1, 0x1E88, 0x0057, 0x0323, 0, - 1, 0x1E89, 0x0077, 0x0323, 0, - 1, 0x1E8A, 0x0058, 0x0307, 0, - 1, 0x1E8B, 0x0078, 0x0307, 0, - 1, 0x1E8C, 0x0058, 0x0308, 0, - 1, 0x1E8D, 0x0078, 0x0308, 0, - 1, 0x1E8E, 0x0059, 0x0307, 0, - 1, 0x1E8F, 0x0079, 0x0307, 0, - 1, 0x1E90, 0x005A, 0x0302, 0, - 1, 0x1E91, 0x007A, 0x0302, 0, - 1, 0x1E92, 0x005A, 0x0323, 0, - 1, 0x1E93, 0x007A, 0x0323, 0, - 1, 0x1E94, 0x005A, 0x0331, 0, - 1, 0x1E95, 0x007A, 0x0331, 0, - 1, 0x1E96, 0x0068, 0x0331, 0, - 1, 0x1E97, 0x0074, 0x0308, 0, - 1, 0x1E98, 0x0077, 0x030A, 0, - 1, 0x1E99, 0x0079, 0x030A, 0, - 16, 0x1E9A, 0x0061, 0x02BE, 0, - 1, 0x1E9B, 0x017F, 0x0307, 0, - 1, 0x1EA0, 0x0041, 0x0323, 0, - 1, 0x1EA1, 0x0061, 0x0323, 0, - 1, 0x1EA2, 0x0041, 0x0309, 0, - 1, 0x1EA3, 0x0061, 0x0309, 0, - 1, 0x1EA4, 0x00C2, 0x0301, 0, - 1, 0x1EA5, 0x00E2, 0x0301, 0, - 1, 0x1EA6, 0x00C2, 0x0300, 0, - 1, 0x1EA7, 0x00E2, 0x0300, 0, - 1, 0x1EA8, 0x00C2, 0x0309, 0, - 1, 0x1EA9, 0x00E2, 0x0309, 0, - 1, 0x1EAA, 0x00C2, 0x0303, 0, - 1, 0x1EAB, 0x00E2, 0x0303, 0, - 1, 0x1EAC, 0x1EA0, 0x0302, 0, - 1, 0x1EAD, 0x1EA1, 0x0302, 0, - 1, 0x1EAE, 0x0102, 0x0301, 0, - 1, 0x1EAF, 0x0103, 0x0301, 0, - 1, 0x1EB0, 0x0102, 0x0300, 0, - 1, 0x1EB1, 0x0103, 0x0300, 0, - 1, 0x1EB2, 0x0102, 0x0309, 0, - 1, 0x1EB3, 0x0103, 0x0309, 0, - 1, 0x1EB4, 0x0102, 0x0303, 0, - 1, 0x1EB5, 0x0103, 0x0303, 0, - 1, 0x1EB6, 0x1EA0, 0x0306, 0, - 1, 0x1EB7, 0x1EA1, 0x0306, 0, - 1, 0x1EB8, 0x0045, 0x0323, 0, - 1, 0x1EB9, 0x0065, 0x0323, 0, - 1, 0x1EBA, 0x0045, 0x0309, 0, - 1, 0x1EBB, 0x0065, 0x0309, 0, - 1, 0x1EBC, 0x0045, 0x0303, 0, - 1, 0x1EBD, 0x0065, 0x0303, 0, - 1, 0x1EBE, 0x00CA, 0x0301, 0, - 1, 0x1EBF, 0x00EA, 0x0301, 0, - 1, 0x1EC0, 0x00CA, 0x0300, 0, - 1, 0x1EC1, 0x00EA, 0x0300, 0, - 1, 0x1EC2, 0x00CA, 0x0309, 0, - 1, 0x1EC3, 0x00EA, 0x0309, 0, - 1, 0x1EC4, 0x00CA, 0x0303, 0, - 1, 0x1EC5, 0x00EA, 0x0303, 0, - 1, 0x1EC6, 0x1EB8, 0x0302, 0, - 1, 0x1EC7, 0x1EB9, 0x0302, 0, - 1, 0x1EC8, 0x0049, 0x0309, 0, - 1, 0x1EC9, 0x0069, 0x0309, 0, - 1, 0x1ECA, 0x0049, 0x0323, 0, - 1, 0x1ECB, 0x0069, 0x0323, 0, - 1, 0x1ECC, 0x004F, 0x0323, 0, - 1, 0x1ECD, 0x006F, 0x0323, 0, - 1, 0x1ECE, 0x004F, 0x0309, 0, - 1, 0x1ECF, 0x006F, 0x0309, 0, - 1, 0x1ED0, 0x00D4, 0x0301, 0, - 1, 0x1ED1, 0x00F4, 0x0301, 0, - 1, 0x1ED2, 0x00D4, 0x0300, 0, - 1, 0x1ED3, 0x00F4, 0x0300, 0, - 1, 0x1ED4, 0x00D4, 0x0309, 0, - 1, 0x1ED5, 0x00F4, 0x0309, 0, - 1, 0x1ED6, 0x00D4, 0x0303, 0, - 1, 0x1ED7, 0x00F4, 0x0303, 0, - 1, 0x1ED8, 0x1ECC, 0x0302, 0, - 1, 0x1ED9, 0x1ECD, 0x0302, 0, - 1, 0x1EDA, 0x01A0, 0x0301, 0, - 1, 0x1EDB, 0x01A1, 0x0301, 0, - 1, 0x1EDC, 0x01A0, 0x0300, 0, - 1, 0x1EDD, 0x01A1, 0x0300, 0, - 1, 0x1EDE, 0x01A0, 0x0309, 0, - 1, 0x1EDF, 0x01A1, 0x0309, 0, - 1, 0x1EE0, 0x01A0, 0x0303, 0, - 1, 0x1EE1, 0x01A1, 0x0303, 0, - 1, 0x1EE2, 0x01A0, 0x0323, 0, - 1, 0x1EE3, 0x01A1, 0x0323, 0, - 1, 0x1EE4, 0x0055, 0x0323, 0, - 1, 0x1EE5, 0x0075, 0x0323, 0, - 1, 0x1EE6, 0x0055, 0x0309, 0, - 1, 0x1EE7, 0x0075, 0x0309, 0, - 1, 0x1EE8, 0x01AF, 0x0301, 0, - 1, 0x1EE9, 0x01B0, 0x0301, 0, - 1, 0x1EEA, 0x01AF, 0x0300, 0, - 1, 0x1EEB, 0x01B0, 0x0300, 0, - 1, 0x1EEC, 0x01AF, 0x0309, 0, - 1, 0x1EED, 0x01B0, 0x0309, 0, - 1, 0x1EEE, 0x01AF, 0x0303, 0, - 1, 0x1EEF, 0x01B0, 0x0303, 0, - 1, 0x1EF0, 0x01AF, 0x0323, 0, - 1, 0x1EF1, 0x01B0, 0x0323, 0, - 1, 0x1EF2, 0x0059, 0x0300, 0, - 1, 0x1EF3, 0x0079, 0x0300, 0, - 1, 0x1EF4, 0x0059, 0x0323, 0, - 1, 0x1EF5, 0x0079, 0x0323, 0, - 1, 0x1EF6, 0x0059, 0x0309, 0, - 1, 0x1EF7, 0x0079, 0x0309, 0, - 1, 0x1EF8, 0x0059, 0x0303, 0, - 1, 0x1EF9, 0x0079, 0x0303, 0, - 1, 0x1F00, 0x03B1, 0x0313, 0, - 1, 0x1F01, 0x03B1, 0x0314, 0, - 1, 0x1F02, 0x1F00, 0x0300, 0, - 1, 0x1F03, 0x1F01, 0x0300, 0, - 1, 0x1F04, 0x1F00, 0x0301, 0, - 1, 0x1F05, 0x1F01, 0x0301, 0, - 1, 0x1F06, 0x1F00, 0x0342, 0, - 1, 0x1F07, 0x1F01, 0x0342, 0, - 1, 0x1F08, 0x0391, 0x0313, 0, - 1, 0x1F09, 0x0391, 0x0314, 0, - 1, 0x1F0A, 0x1F08, 0x0300, 0, - 1, 0x1F0B, 0x1F09, 0x0300, 0, - 1, 0x1F0C, 0x1F08, 0x0301, 0, - 1, 0x1F0D, 0x1F09, 0x0301, 0, - 1, 0x1F0E, 0x1F08, 0x0342, 0, - 1, 0x1F0F, 0x1F09, 0x0342, 0, - 1, 0x1F10, 0x03B5, 0x0313, 0, - 1, 0x1F11, 0x03B5, 0x0314, 0, - 1, 0x1F12, 0x1F10, 0x0300, 0, - 1, 0x1F13, 0x1F11, 0x0300, 0, - 1, 0x1F14, 0x1F10, 0x0301, 0, - 1, 0x1F15, 0x1F11, 0x0301, 0, - 1, 0x1F18, 0x0395, 0x0313, 0, - 1, 0x1F19, 0x0395, 0x0314, 0, - 1, 0x1F1A, 0x1F18, 0x0300, 0, - 1, 0x1F1B, 0x1F19, 0x0300, 0, - 1, 0x1F1C, 0x1F18, 0x0301, 0, - 1, 0x1F1D, 0x1F19, 0x0301, 0, - 1, 0x1F20, 0x03B7, 0x0313, 0, - 1, 0x1F21, 0x03B7, 0x0314, 0, - 1, 0x1F22, 0x1F20, 0x0300, 0, - 1, 0x1F23, 0x1F21, 0x0300, 0, - 1, 0x1F24, 0x1F20, 0x0301, 0, - 1, 0x1F25, 0x1F21, 0x0301, 0, - 1, 0x1F26, 0x1F20, 0x0342, 0, - 1, 0x1F27, 0x1F21, 0x0342, 0, - 1, 0x1F28, 0x0397, 0x0313, 0, - 1, 0x1F29, 0x0397, 0x0314, 0, - 1, 0x1F2A, 0x1F28, 0x0300, 0, - 1, 0x1F2B, 0x1F29, 0x0300, 0, - 1, 0x1F2C, 0x1F28, 0x0301, 0, - 1, 0x1F2D, 0x1F29, 0x0301, 0, - 1, 0x1F2E, 0x1F28, 0x0342, 0, - 1, 0x1F2F, 0x1F29, 0x0342, 0, - 1, 0x1F30, 0x03B9, 0x0313, 0, - 1, 0x1F31, 0x03B9, 0x0314, 0, - 1, 0x1F32, 0x1F30, 0x0300, 0, - 1, 0x1F33, 0x1F31, 0x0300, 0, - 1, 0x1F34, 0x1F30, 0x0301, 0, - 1, 0x1F35, 0x1F31, 0x0301, 0, - 1, 0x1F36, 0x1F30, 0x0342, 0, - 1, 0x1F37, 0x1F31, 0x0342, 0, - 1, 0x1F38, 0x0399, 0x0313, 0, - 1, 0x1F39, 0x0399, 0x0314, 0, - 1, 0x1F3A, 0x1F38, 0x0300, 0, - 1, 0x1F3B, 0x1F39, 0x0300, 0, - 1, 0x1F3C, 0x1F38, 0x0301, 0, - 1, 0x1F3D, 0x1F39, 0x0301, 0, - 1, 0x1F3E, 0x1F38, 0x0342, 0, - 1, 0x1F3F, 0x1F39, 0x0342, 0, - 1, 0x1F40, 0x03BF, 0x0313, 0, - 1, 0x1F41, 0x03BF, 0x0314, 0, - 1, 0x1F42, 0x1F40, 0x0300, 0, - 1, 0x1F43, 0x1F41, 0x0300, 0, - 1, 0x1F44, 0x1F40, 0x0301, 0, - 1, 0x1F45, 0x1F41, 0x0301, 0, - 1, 0x1F48, 0x039F, 0x0313, 0, - 1, 0x1F49, 0x039F, 0x0314, 0, - 1, 0x1F4A, 0x1F48, 0x0300, 0, - 1, 0x1F4B, 0x1F49, 0x0300, 0, - 1, 0x1F4C, 0x1F48, 0x0301, 0, - 1, 0x1F4D, 0x1F49, 0x0301, 0, - 1, 0x1F50, 0x03C5, 0x0313, 0, - 1, 0x1F51, 0x03C5, 0x0314, 0, - 1, 0x1F52, 0x1F50, 0x0300, 0, - 1, 0x1F53, 0x1F51, 0x0300, 0, - 1, 0x1F54, 0x1F50, 0x0301, 0, - 1, 0x1F55, 0x1F51, 0x0301, 0, - 1, 0x1F56, 0x1F50, 0x0342, 0, - 1, 0x1F57, 0x1F51, 0x0342, 0, - 1, 0x1F59, 0x03A5, 0x0314, 0, - 1, 0x1F5B, 0x1F59, 0x0300, 0, - 1, 0x1F5D, 0x1F59, 0x0301, 0, - 1, 0x1F5F, 0x1F59, 0x0342, 0, - 1, 0x1F60, 0x03C9, 0x0313, 0, - 1, 0x1F61, 0x03C9, 0x0314, 0, - 1, 0x1F62, 0x1F60, 0x0300, 0, - 1, 0x1F63, 0x1F61, 0x0300, 0, - 1, 0x1F64, 0x1F60, 0x0301, 0, - 1, 0x1F65, 0x1F61, 0x0301, 0, - 1, 0x1F66, 0x1F60, 0x0342, 0, - 1, 0x1F67, 0x1F61, 0x0342, 0, - 1, 0x1F68, 0x03A9, 0x0313, 0, - 1, 0x1F69, 0x03A9, 0x0314, 0, - 1, 0x1F6A, 0x1F68, 0x0300, 0, - 1, 0x1F6B, 0x1F69, 0x0300, 0, - 1, 0x1F6C, 0x1F68, 0x0301, 0, - 1, 0x1F6D, 0x1F69, 0x0301, 0, - 1, 0x1F6E, 0x1F68, 0x0342, 0, - 1, 0x1F6F, 0x1F69, 0x0342, 0, - 1, 0x1F70, 0x03B1, 0x0300, 0, - 1, 0x1F71, 0x03AC, 0, - 1, 0x1F72, 0x03B5, 0x0300, 0, - 1, 0x1F73, 0x03AD, 0, - 1, 0x1F74, 0x03B7, 0x0300, 0, - 1, 0x1F75, 0x03AE, 0, - 1, 0x1F76, 0x03B9, 0x0300, 0, - 1, 0x1F77, 0x03AF, 0, - 1, 0x1F78, 0x03BF, 0x0300, 0, - 1, 0x1F79, 0x03CC, 0, - 1, 0x1F7A, 0x03C5, 0x0300, 0, - 1, 0x1F7B, 0x03CD, 0, - 1, 0x1F7C, 0x03C9, 0x0300, 0, - 1, 0x1F7D, 0x03CE, 0, - 1, 0x1F80, 0x1F00, 0x0345, 0, - 1, 0x1F81, 0x1F01, 0x0345, 0, - 1, 0x1F82, 0x1F02, 0x0345, 0, - 1, 0x1F83, 0x1F03, 0x0345, 0, - 1, 0x1F84, 0x1F04, 0x0345, 0, - 1, 0x1F85, 0x1F05, 0x0345, 0, - 1, 0x1F86, 0x1F06, 0x0345, 0, - 1, 0x1F87, 0x1F07, 0x0345, 0, - 1, 0x1F88, 0x1F08, 0x0345, 0, - 1, 0x1F89, 0x1F09, 0x0345, 0, - 1, 0x1F8A, 0x1F0A, 0x0345, 0, - 1, 0x1F8B, 0x1F0B, 0x0345, 0, - 1, 0x1F8C, 0x1F0C, 0x0345, 0, - 1, 0x1F8D, 0x1F0D, 0x0345, 0, - 1, 0x1F8E, 0x1F0E, 0x0345, 0, - 1, 0x1F8F, 0x1F0F, 0x0345, 0, - 1, 0x1F90, 0x1F20, 0x0345, 0, - 1, 0x1F91, 0x1F21, 0x0345, 0, - 1, 0x1F92, 0x1F22, 0x0345, 0, - 1, 0x1F93, 0x1F23, 0x0345, 0, - 1, 0x1F94, 0x1F24, 0x0345, 0, - 1, 0x1F95, 0x1F25, 0x0345, 0, - 1, 0x1F96, 0x1F26, 0x0345, 0, - 1, 0x1F97, 0x1F27, 0x0345, 0, - 1, 0x1F98, 0x1F28, 0x0345, 0, - 1, 0x1F99, 0x1F29, 0x0345, 0, - 1, 0x1F9A, 0x1F2A, 0x0345, 0, - 1, 0x1F9B, 0x1F2B, 0x0345, 0, - 1, 0x1F9C, 0x1F2C, 0x0345, 0, - 1, 0x1F9D, 0x1F2D, 0x0345, 0, - 1, 0x1F9E, 0x1F2E, 0x0345, 0, - 1, 0x1F9F, 0x1F2F, 0x0345, 0, - 1, 0x1FA0, 0x1F60, 0x0345, 0, - 1, 0x1FA1, 0x1F61, 0x0345, 0, - 1, 0x1FA2, 0x1F62, 0x0345, 0, - 1, 0x1FA3, 0x1F63, 0x0345, 0, - 1, 0x1FA4, 0x1F64, 0x0345, 0, - 1, 0x1FA5, 0x1F65, 0x0345, 0, - 1, 0x1FA6, 0x1F66, 0x0345, 0, - 1, 0x1FA7, 0x1F67, 0x0345, 0, - 1, 0x1FA8, 0x1F68, 0x0345, 0, - 1, 0x1FA9, 0x1F69, 0x0345, 0, - 1, 0x1FAA, 0x1F6A, 0x0345, 0, - 1, 0x1FAB, 0x1F6B, 0x0345, 0, - 1, 0x1FAC, 0x1F6C, 0x0345, 0, - 1, 0x1FAD, 0x1F6D, 0x0345, 0, - 1, 0x1FAE, 0x1F6E, 0x0345, 0, - 1, 0x1FAF, 0x1F6F, 0x0345, 0, - 1, 0x1FB0, 0x03B1, 0x0306, 0, - 1, 0x1FB1, 0x03B1, 0x0304, 0, - 1, 0x1FB2, 0x1F70, 0x0345, 0, - 1, 0x1FB3, 0x03B1, 0x0345, 0, - 1, 0x1FB4, 0x03AC, 0x0345, 0, - 1, 0x1FB6, 0x03B1, 0x0342, 0, - 1, 0x1FB7, 0x1FB6, 0x0345, 0, - 1, 0x1FB8, 0x0391, 0x0306, 0, - 1, 0x1FB9, 0x0391, 0x0304, 0, - 1, 0x1FBA, 0x0391, 0x0300, 0, - 1, 0x1FBB, 0x0386, 0, - 1, 0x1FBC, 0x0391, 0x0345, 0, - 16, 0x1FBD, 0x0020, 0x0313, 0, - 1, 0x1FBE, 0x03B9, 0, - 16, 0x1FBF, 0x0020, 0x0313, 0, - 16, 0x1FC0, 0x0020, 0x0342, 0, - 1, 0x1FC1, 0x00A8, 0x0342, 0, - 1, 0x1FC2, 0x1F74, 0x0345, 0, - 1, 0x1FC3, 0x03B7, 0x0345, 0, - 1, 0x1FC4, 0x03AE, 0x0345, 0, - 1, 0x1FC6, 0x03B7, 0x0342, 0, - 1, 0x1FC7, 0x1FC6, 0x0345, 0, - 1, 0x1FC8, 0x0395, 0x0300, 0, - 1, 0x1FC9, 0x0388, 0, - 1, 0x1FCA, 0x0397, 0x0300, 0, - 1, 0x1FCB, 0x0389, 0, - 1, 0x1FCC, 0x0397, 0x0345, 0, - 1, 0x1FCD, 0x1FBF, 0x0300, 0, - 1, 0x1FCE, 0x1FBF, 0x0301, 0, - 1, 0x1FCF, 0x1FBF, 0x0342, 0, - 1, 0x1FD0, 0x03B9, 0x0306, 0, - 1, 0x1FD1, 0x03B9, 0x0304, 0, - 1, 0x1FD2, 0x03CA, 0x0300, 0, - 1, 0x1FD3, 0x0390, 0, - 1, 0x1FD6, 0x03B9, 0x0342, 0, - 1, 0x1FD7, 0x03CA, 0x0342, 0, - 1, 0x1FD8, 0x0399, 0x0306, 0, - 1, 0x1FD9, 0x0399, 0x0304, 0, - 1, 0x1FDA, 0x0399, 0x0300, 0, - 1, 0x1FDB, 0x038A, 0, - 1, 0x1FDD, 0x1FFE, 0x0300, 0, - 1, 0x1FDE, 0x1FFE, 0x0301, 0, - 1, 0x1FDF, 0x1FFE, 0x0342, 0, - 1, 0x1FE0, 0x03C5, 0x0306, 0, - 1, 0x1FE1, 0x03C5, 0x0304, 0, - 1, 0x1FE2, 0x03CB, 0x0300, 0, - 1, 0x1FE3, 0x03B0, 0, - 1, 0x1FE4, 0x03C1, 0x0313, 0, - 1, 0x1FE5, 0x03C1, 0x0314, 0, - 1, 0x1FE6, 0x03C5, 0x0342, 0, - 1, 0x1FE7, 0x03CB, 0x0342, 0, - 1, 0x1FE8, 0x03A5, 0x0306, 0, - 1, 0x1FE9, 0x03A5, 0x0304, 0, - 1, 0x1FEA, 0x03A5, 0x0300, 0, - 1, 0x1FEB, 0x038E, 0, - 1, 0x1FEC, 0x03A1, 0x0314, 0, - 1, 0x1FED, 0x00A8, 0x0300, 0, - 1, 0x1FEE, 0x0385, 0, - 1, 0x1FEF, 0x0060, 0, - 1, 0x1FF2, 0x1F7C, 0x0345, 0, - 1, 0x1FF3, 0x03C9, 0x0345, 0, - 1, 0x1FF4, 0x03CE, 0x0345, 0, - 1, 0x1FF6, 0x03C9, 0x0342, 0, - 1, 0x1FF7, 0x1FF6, 0x0345, 0, - 1, 0x1FF8, 0x039F, 0x0300, 0, - 1, 0x1FF9, 0x038C, 0, - 1, 0x1FFA, 0x03A9, 0x0300, 0, - 1, 0x1FFB, 0x038F, 0, - 1, 0x1FFC, 0x03A9, 0x0345, 0, - 1, 0x1FFD, 0x00B4, 0, - 16, 0x1FFE, 0x0020, 0x0314, 0, - 1, 0x2000, 0x2002, 0, - 1, 0x2001, 0x2003, 0, - 16, 0x2002, 0x0020, 0, - 16, 0x2003, 0x0020, 0, - 16, 0x2004, 0x0020, 0, - 16, 0x2005, 0x0020, 0, - 16, 0x2006, 0x0020, 0, - 3, 0x2007, 0x0020, 0, - 16, 0x2008, 0x0020, 0, - 16, 0x2009, 0x0020, 0, - 16, 0x200A, 0x0020, 0, - 3, 0x2011, 0x2010, 0, - 16, 0x2017, 0x0020, 0x0333, 0, - 16, 0x2024, 0x002E, 0, - 16, 0x2025, 0x002E, 0x002E, 0, - 16, 0x2026, 0x002E, 0x002E, 0x002E, 0, - 3, 0x202F, 0x0020, 0, - 16, 0x2033, 0x2032, 0x2032, 0, - 16, 0x2034, 0x2032, 0x2032, 0x2032, 0, - 16, 0x2036, 0x2035, 0x2035, 0, - 16, 0x2037, 0x2035, 0x2035, 0x2035, 0, - 16, 0x203C, 0x0021, 0x0021, 0, - 16, 0x203E, 0x0020, 0x0305, 0, - 16, 0x2047, 0x003F, 0x003F, 0, - 16, 0x2048, 0x003F, 0x0021, 0, - 16, 0x2049, 0x0021, 0x003F, 0, - 16, 0x2057, 0x2032, 0x2032, 0x2032, 0x2032, 0, - 16, 0x205F, 0x0020, 0, - 9, 0x2070, 0x0030, 0, - 9, 0x2071, 0x0069, 0, - 9, 0x2074, 0x0034, 0, - 9, 0x2075, 0x0035, 0, - 9, 0x2076, 0x0036, 0, - 9, 0x2077, 0x0037, 0, - 9, 0x2078, 0x0038, 0, - 9, 0x2079, 0x0039, 0, - 9, 0x207A, 0x002B, 0, - 9, 0x207B, 0x2212, 0, - 9, 0x207C, 0x003D, 0, - 9, 0x207D, 0x0028, 0, - 9, 0x207E, 0x0029, 0, - 9, 0x207F, 0x006E, 0, - 10, 0x2080, 0x0030, 0, - 10, 0x2081, 0x0031, 0, - 10, 0x2082, 0x0032, 0, - 10, 0x2083, 0x0033, 0, - 10, 0x2084, 0x0034, 0, - 10, 0x2085, 0x0035, 0, - 10, 0x2086, 0x0036, 0, - 10, 0x2087, 0x0037, 0, - 10, 0x2088, 0x0038, 0, - 10, 0x2089, 0x0039, 0, - 10, 0x208A, 0x002B, 0, - 10, 0x208B, 0x2212, 0, - 10, 0x208C, 0x003D, 0, - 10, 0x208D, 0x0028, 0, - 10, 0x208E, 0x0029, 0, - 16, 0x20A8, 0x0052, 0x0073, 0, - 16, 0x2100, 0x0061, 0x002F, 0x0063, 0, - 16, 0x2101, 0x0061, 0x002F, 0x0073, 0, - 2, 0x2102, 0x0043, 0, - 16, 0x2103, 0x00B0, 0x0043, 0, - 16, 0x2105, 0x0063, 0x002F, 0x006F, 0, - 16, 0x2106, 0x0063, 0x002F, 0x0075, 0, - 16, 0x2107, 0x0190, 0, - 16, 0x2109, 0x00B0, 0x0046, 0, - 2, 0x210A, 0x0067, 0, - 2, 0x210B, 0x0048, 0, - 2, 0x210C, 0x0048, 0, - 2, 0x210D, 0x0048, 0, - 2, 0x210E, 0x0068, 0, - 2, 0x210F, 0x0127, 0, - 2, 0x2110, 0x0049, 0, - 2, 0x2111, 0x0049, 0, - 2, 0x2112, 0x004C, 0, - 2, 0x2113, 0x006C, 0, - 2, 0x2115, 0x004E, 0, - 16, 0x2116, 0x004E, 0x006F, 0, - 2, 0x2119, 0x0050, 0, - 2, 0x211A, 0x0051, 0, - 2, 0x211B, 0x0052, 0, - 2, 0x211C, 0x0052, 0, - 2, 0x211D, 0x0052, 0, - 9, 0x2120, 0x0053, 0x004D, 0, - 16, 0x2121, 0x0054, 0x0045, 0x004C, 0, - 9, 0x2122, 0x0054, 0x004D, 0, - 2, 0x2124, 0x005A, 0, - 1, 0x2126, 0x03A9, 0, - 2, 0x2128, 0x005A, 0, - 1, 0x212A, 0x004B, 0, - 1, 0x212B, 0x00C5, 0, - 2, 0x212C, 0x0042, 0, - 2, 0x212D, 0x0043, 0, - 2, 0x212F, 0x0065, 0, - 2, 0x2130, 0x0045, 0, - 2, 0x2131, 0x0046, 0, - 2, 0x2133, 0x004D, 0, - 2, 0x2134, 0x006F, 0, - 16, 0x2135, 0x05D0, 0, - 16, 0x2136, 0x05D1, 0, - 16, 0x2137, 0x05D2, 0, - 16, 0x2138, 0x05D3, 0, - 2, 0x2139, 0x0069, 0, - 2, 0x213D, 0x03B3, 0, - 2, 0x213E, 0x0393, 0, - 2, 0x213F, 0x03A0, 0, - 2, 0x2140, 0x2211, 0, - 2, 0x2145, 0x0044, 0, - 2, 0x2146, 0x0064, 0, - 2, 0x2147, 0x0065, 0, - 2, 0x2148, 0x0069, 0, - 2, 0x2149, 0x006A, 0, - 17, 0x2153, 0x0031, 0x2044, 0x0033, 0, - 17, 0x2154, 0x0032, 0x2044, 0x0033, 0, - 17, 0x2155, 0x0031, 0x2044, 0x0035, 0, - 17, 0x2156, 0x0032, 0x2044, 0x0035, 0, - 17, 0x2157, 0x0033, 0x2044, 0x0035, 0, - 17, 0x2158, 0x0034, 0x2044, 0x0035, 0, - 17, 0x2159, 0x0031, 0x2044, 0x0036, 0, - 17, 0x215A, 0x0035, 0x2044, 0x0036, 0, - 17, 0x215B, 0x0031, 0x2044, 0x0038, 0, - 17, 0x215C, 0x0033, 0x2044, 0x0038, 0, - 17, 0x215D, 0x0035, 0x2044, 0x0038, 0, - 17, 0x215E, 0x0037, 0x2044, 0x0038, 0, - 17, 0x215F, 0x0031, 0x2044, 0, - 16, 0x2160, 0x0049, 0, - 16, 0x2161, 0x0049, 0x0049, 0, - 16, 0x2162, 0x0049, 0x0049, 0x0049, 0, - 16, 0x2163, 0x0049, 0x0056, 0, - 16, 0x2164, 0x0056, 0, - 16, 0x2165, 0x0056, 0x0049, 0, - 16, 0x2166, 0x0056, 0x0049, 0x0049, 0, - 16, 0x2167, 0x0056, 0x0049, 0x0049, 0x0049, 0, - 16, 0x2168, 0x0049, 0x0058, 0, - 16, 0x2169, 0x0058, 0, - 16, 0x216A, 0x0058, 0x0049, 0, - 16, 0x216B, 0x0058, 0x0049, 0x0049, 0, - 16, 0x216C, 0x004C, 0, - 16, 0x216D, 0x0043, 0, - 16, 0x216E, 0x0044, 0, - 16, 0x216F, 0x004D, 0, - 16, 0x2170, 0x0069, 0, - 16, 0x2171, 0x0069, 0x0069, 0, - 16, 0x2172, 0x0069, 0x0069, 0x0069, 0, - 16, 0x2173, 0x0069, 0x0076, 0, - 16, 0x2174, 0x0076, 0, - 16, 0x2175, 0x0076, 0x0069, 0, - 16, 0x2176, 0x0076, 0x0069, 0x0069, 0, - 16, 0x2177, 0x0076, 0x0069, 0x0069, 0x0069, 0, - 16, 0x2178, 0x0069, 0x0078, 0, - 16, 0x2179, 0x0078, 0, - 16, 0x217A, 0x0078, 0x0069, 0, - 16, 0x217B, 0x0078, 0x0069, 0x0069, 0, - 16, 0x217C, 0x006C, 0, - 16, 0x217D, 0x0063, 0, - 16, 0x217E, 0x0064, 0, - 16, 0x217F, 0x006D, 0, - 1, 0x219A, 0x2190, 0x0338, 0, - 1, 0x219B, 0x2192, 0x0338, 0, - 1, 0x21AE, 0x2194, 0x0338, 0, - 1, 0x21CD, 0x21D0, 0x0338, 0, - 1, 0x21CE, 0x21D4, 0x0338, 0, - 1, 0x21CF, 0x21D2, 0x0338, 0, - 1, 0x2204, 0x2203, 0x0338, 0, - 1, 0x2209, 0x2208, 0x0338, 0, - 1, 0x220C, 0x220B, 0x0338, 0, - 1, 0x2224, 0x2223, 0x0338, 0, - 1, 0x2226, 0x2225, 0x0338, 0, - 16, 0x222C, 0x222B, 0x222B, 0, - 16, 0x222D, 0x222B, 0x222B, 0x222B, 0, - 16, 0x222F, 0x222E, 0x222E, 0, - 16, 0x2230, 0x222E, 0x222E, 0x222E, 0, - 1, 0x2241, 0x223C, 0x0338, 0, - 1, 0x2244, 0x2243, 0x0338, 0, - 1, 0x2247, 0x2245, 0x0338, 0, - 1, 0x2249, 0x2248, 0x0338, 0, - 1, 0x2260, 0x003D, 0x0338, 0, - 1, 0x2262, 0x2261, 0x0338, 0, - 1, 0x226D, 0x224D, 0x0338, 0, - 1, 0x226E, 0x003C, 0x0338, 0, - 1, 0x226F, 0x003E, 0x0338, 0, - 1, 0x2270, 0x2264, 0x0338, 0, - 1, 0x2271, 0x2265, 0x0338, 0, - 1, 0x2274, 0x2272, 0x0338, 0, - 1, 0x2275, 0x2273, 0x0338, 0, - 1, 0x2278, 0x2276, 0x0338, 0, - 1, 0x2279, 0x2277, 0x0338, 0, - 1, 0x2280, 0x227A, 0x0338, 0, - 1, 0x2281, 0x227B, 0x0338, 0, - 1, 0x2284, 0x2282, 0x0338, 0, - 1, 0x2285, 0x2283, 0x0338, 0, - 1, 0x2288, 0x2286, 0x0338, 0, - 1, 0x2289, 0x2287, 0x0338, 0, - 1, 0x22AC, 0x22A2, 0x0338, 0, - 1, 0x22AD, 0x22A8, 0x0338, 0, - 1, 0x22AE, 0x22A9, 0x0338, 0, - 1, 0x22AF, 0x22AB, 0x0338, 0, - 1, 0x22E0, 0x227C, 0x0338, 0, - 1, 0x22E1, 0x227D, 0x0338, 0, - 1, 0x22E2, 0x2291, 0x0338, 0, - 1, 0x22E3, 0x2292, 0x0338, 0, - 1, 0x22EA, 0x22B2, 0x0338, 0, - 1, 0x22EB, 0x22B3, 0x0338, 0, - 1, 0x22EC, 0x22B4, 0x0338, 0, - 1, 0x22ED, 0x22B5, 0x0338, 0, - 1, 0x2329, 0x3008, 0, - 1, 0x232A, 0x3009, 0, - 8, 0x2460, 0x0031, 0, - 8, 0x2461, 0x0032, 0, - 8, 0x2462, 0x0033, 0, - 8, 0x2463, 0x0034, 0, - 8, 0x2464, 0x0035, 0, - 8, 0x2465, 0x0036, 0, - 8, 0x2466, 0x0037, 0, - 8, 0x2467, 0x0038, 0, - 8, 0x2468, 0x0039, 0, - 8, 0x2469, 0x0031, 0x0030, 0, - 8, 0x246A, 0x0031, 0x0031, 0, - 8, 0x246B, 0x0031, 0x0032, 0, - 8, 0x246C, 0x0031, 0x0033, 0, - 8, 0x246D, 0x0031, 0x0034, 0, - 8, 0x246E, 0x0031, 0x0035, 0, - 8, 0x246F, 0x0031, 0x0036, 0, - 8, 0x2470, 0x0031, 0x0037, 0, - 8, 0x2471, 0x0031, 0x0038, 0, - 8, 0x2472, 0x0031, 0x0039, 0, - 8, 0x2473, 0x0032, 0x0030, 0, - 16, 0x2474, 0x0028, 0x0031, 0x0029, 0, - 16, 0x2475, 0x0028, 0x0032, 0x0029, 0, - 16, 0x2476, 0x0028, 0x0033, 0x0029, 0, - 16, 0x2477, 0x0028, 0x0034, 0x0029, 0, - 16, 0x2478, 0x0028, 0x0035, 0x0029, 0, - 16, 0x2479, 0x0028, 0x0036, 0x0029, 0, - 16, 0x247A, 0x0028, 0x0037, 0x0029, 0, - 16, 0x247B, 0x0028, 0x0038, 0x0029, 0, - 16, 0x247C, 0x0028, 0x0039, 0x0029, 0, - 16, 0x247D, 0x0028, 0x0031, 0x0030, 0x0029, 0, - 16, 0x247E, 0x0028, 0x0031, 0x0031, 0x0029, 0, - 16, 0x247F, 0x0028, 0x0031, 0x0032, 0x0029, 0, - 16, 0x2480, 0x0028, 0x0031, 0x0033, 0x0029, 0, - 16, 0x2481, 0x0028, 0x0031, 0x0034, 0x0029, 0, - 16, 0x2482, 0x0028, 0x0031, 0x0035, 0x0029, 0, - 16, 0x2483, 0x0028, 0x0031, 0x0036, 0x0029, 0, - 16, 0x2484, 0x0028, 0x0031, 0x0037, 0x0029, 0, - 16, 0x2485, 0x0028, 0x0031, 0x0038, 0x0029, 0, - 16, 0x2486, 0x0028, 0x0031, 0x0039, 0x0029, 0, - 16, 0x2487, 0x0028, 0x0032, 0x0030, 0x0029, 0, - 16, 0x2488, 0x0031, 0x002E, 0, - 16, 0x2489, 0x0032, 0x002E, 0, - 16, 0x248A, 0x0033, 0x002E, 0, - 16, 0x248B, 0x0034, 0x002E, 0, - 16, 0x248C, 0x0035, 0x002E, 0, - 16, 0x248D, 0x0036, 0x002E, 0, - 16, 0x248E, 0x0037, 0x002E, 0, - 16, 0x248F, 0x0038, 0x002E, 0, - 16, 0x2490, 0x0039, 0x002E, 0, - 16, 0x2491, 0x0031, 0x0030, 0x002E, 0, - 16, 0x2492, 0x0031, 0x0031, 0x002E, 0, - 16, 0x2493, 0x0031, 0x0032, 0x002E, 0, - 16, 0x2494, 0x0031, 0x0033, 0x002E, 0, - 16, 0x2495, 0x0031, 0x0034, 0x002E, 0, - 16, 0x2496, 0x0031, 0x0035, 0x002E, 0, - 16, 0x2497, 0x0031, 0x0036, 0x002E, 0, - 16, 0x2498, 0x0031, 0x0037, 0x002E, 0, - 16, 0x2499, 0x0031, 0x0038, 0x002E, 0, - 16, 0x249A, 0x0031, 0x0039, 0x002E, 0, - 16, 0x249B, 0x0032, 0x0030, 0x002E, 0, - 16, 0x249C, 0x0028, 0x0061, 0x0029, 0, - 16, 0x249D, 0x0028, 0x0062, 0x0029, 0, - 16, 0x249E, 0x0028, 0x0063, 0x0029, 0, - 16, 0x249F, 0x0028, 0x0064, 0x0029, 0, - 16, 0x24A0, 0x0028, 0x0065, 0x0029, 0, - 16, 0x24A1, 0x0028, 0x0066, 0x0029, 0, - 16, 0x24A2, 0x0028, 0x0067, 0x0029, 0, - 16, 0x24A3, 0x0028, 0x0068, 0x0029, 0, - 16, 0x24A4, 0x0028, 0x0069, 0x0029, 0, - 16, 0x24A5, 0x0028, 0x006A, 0x0029, 0, - 16, 0x24A6, 0x0028, 0x006B, 0x0029, 0, - 16, 0x24A7, 0x0028, 0x006C, 0x0029, 0, - 16, 0x24A8, 0x0028, 0x006D, 0x0029, 0, - 16, 0x24A9, 0x0028, 0x006E, 0x0029, 0, - 16, 0x24AA, 0x0028, 0x006F, 0x0029, 0, - 16, 0x24AB, 0x0028, 0x0070, 0x0029, 0, - 16, 0x24AC, 0x0028, 0x0071, 0x0029, 0, - 16, 0x24AD, 0x0028, 0x0072, 0x0029, 0, - 16, 0x24AE, 0x0028, 0x0073, 0x0029, 0, - 16, 0x24AF, 0x0028, 0x0074, 0x0029, 0, - 16, 0x24B0, 0x0028, 0x0075, 0x0029, 0, - 16, 0x24B1, 0x0028, 0x0076, 0x0029, 0, - 16, 0x24B2, 0x0028, 0x0077, 0x0029, 0, - 16, 0x24B3, 0x0028, 0x0078, 0x0029, 0, - 16, 0x24B4, 0x0028, 0x0079, 0x0029, 0, - 16, 0x24B5, 0x0028, 0x007A, 0x0029, 0, - 8, 0x24B6, 0x0041, 0, - 8, 0x24B7, 0x0042, 0, - 8, 0x24B8, 0x0043, 0, - 8, 0x24B9, 0x0044, 0, - 8, 0x24BA, 0x0045, 0, - 8, 0x24BB, 0x0046, 0, - 8, 0x24BC, 0x0047, 0, - 8, 0x24BD, 0x0048, 0, - 8, 0x24BE, 0x0049, 0, - 8, 0x24BF, 0x004A, 0, - 8, 0x24C0, 0x004B, 0, - 8, 0x24C1, 0x004C, 0, - 8, 0x24C2, 0x004D, 0, - 8, 0x24C3, 0x004E, 0, - 8, 0x24C4, 0x004F, 0, - 8, 0x24C5, 0x0050, 0, - 8, 0x24C6, 0x0051, 0, - 8, 0x24C7, 0x0052, 0, - 8, 0x24C8, 0x0053, 0, - 8, 0x24C9, 0x0054, 0, - 8, 0x24CA, 0x0055, 0, - 8, 0x24CB, 0x0056, 0, - 8, 0x24CC, 0x0057, 0, - 8, 0x24CD, 0x0058, 0, - 8, 0x24CE, 0x0059, 0, - 8, 0x24CF, 0x005A, 0, - 8, 0x24D0, 0x0061, 0, - 8, 0x24D1, 0x0062, 0, - 8, 0x24D2, 0x0063, 0, - 8, 0x24D3, 0x0064, 0, - 8, 0x24D4, 0x0065, 0, - 8, 0x24D5, 0x0066, 0, - 8, 0x24D6, 0x0067, 0, - 8, 0x24D7, 0x0068, 0, - 8, 0x24D8, 0x0069, 0, - 8, 0x24D9, 0x006A, 0, - 8, 0x24DA, 0x006B, 0, - 8, 0x24DB, 0x006C, 0, - 8, 0x24DC, 0x006D, 0, - 8, 0x24DD, 0x006E, 0, - 8, 0x24DE, 0x006F, 0, - 8, 0x24DF, 0x0070, 0, - 8, 0x24E0, 0x0071, 0, - 8, 0x24E1, 0x0072, 0, - 8, 0x24E2, 0x0073, 0, - 8, 0x24E3, 0x0074, 0, - 8, 0x24E4, 0x0075, 0, - 8, 0x24E5, 0x0076, 0, - 8, 0x24E6, 0x0077, 0, - 8, 0x24E7, 0x0078, 0, - 8, 0x24E8, 0x0079, 0, - 8, 0x24E9, 0x007A, 0, - 8, 0x24EA, 0x0030, 0, - 16, 0x2A0C, 0x222B, 0x222B, 0x222B, 0x222B, 0, - 16, 0x2A74, 0x003A, 0x003A, 0x003D, 0, - 16, 0x2A75, 0x003D, 0x003D, 0, - 16, 0x2A76, 0x003D, 0x003D, 0x003D, 0, - 1, 0x2ADC, 0x2ADD, 0x0338, 0, - 16, 0x2E9F, 0x6BCD, 0, - 16, 0x2EF3, 0x9F9F, 0, - 16, 0x2F00, 0x4E00, 0, - 16, 0x2F01, 0x4E28, 0, - 16, 0x2F02, 0x4E36, 0, - 16, 0x2F03, 0x4E3F, 0, - 16, 0x2F04, 0x4E59, 0, - 16, 0x2F05, 0x4E85, 0, - 16, 0x2F06, 0x4E8C, 0, - 16, 0x2F07, 0x4EA0, 0, - 16, 0x2F08, 0x4EBA, 0, - 16, 0x2F09, 0x513F, 0, - 16, 0x2F0A, 0x5165, 0, - 16, 0x2F0B, 0x516B, 0, - 16, 0x2F0C, 0x5182, 0, - 16, 0x2F0D, 0x5196, 0, - 16, 0x2F0E, 0x51AB, 0, - 16, 0x2F0F, 0x51E0, 0, - 16, 0x2F10, 0x51F5, 0, - 16, 0x2F11, 0x5200, 0, - 16, 0x2F12, 0x529B, 0, - 16, 0x2F13, 0x52F9, 0, - 16, 0x2F14, 0x5315, 0, - 16, 0x2F15, 0x531A, 0, - 16, 0x2F16, 0x5338, 0, - 16, 0x2F17, 0x5341, 0, - 16, 0x2F18, 0x535C, 0, - 16, 0x2F19, 0x5369, 0, - 16, 0x2F1A, 0x5382, 0, - 16, 0x2F1B, 0x53B6, 0, - 16, 0x2F1C, 0x53C8, 0, - 16, 0x2F1D, 0x53E3, 0, - 16, 0x2F1E, 0x56D7, 0, - 16, 0x2F1F, 0x571F, 0, - 16, 0x2F20, 0x58EB, 0, - 16, 0x2F21, 0x5902, 0, - 16, 0x2F22, 0x590A, 0, - 16, 0x2F23, 0x5915, 0, - 16, 0x2F24, 0x5927, 0, - 16, 0x2F25, 0x5973, 0, - 16, 0x2F26, 0x5B50, 0, - 16, 0x2F27, 0x5B80, 0, - 16, 0x2F28, 0x5BF8, 0, - 16, 0x2F29, 0x5C0F, 0, - 16, 0x2F2A, 0x5C22, 0, - 16, 0x2F2B, 0x5C38, 0, - 16, 0x2F2C, 0x5C6E, 0, - 16, 0x2F2D, 0x5C71, 0, - 16, 0x2F2E, 0x5DDB, 0, - 16, 0x2F2F, 0x5DE5, 0, - 16, 0x2F30, 0x5DF1, 0, - 16, 0x2F31, 0x5DFE, 0, - 16, 0x2F32, 0x5E72, 0, - 16, 0x2F33, 0x5E7A, 0, - 16, 0x2F34, 0x5E7F, 0, - 16, 0x2F35, 0x5EF4, 0, - 16, 0x2F36, 0x5EFE, 0, - 16, 0x2F37, 0x5F0B, 0, - 16, 0x2F38, 0x5F13, 0, - 16, 0x2F39, 0x5F50, 0, - 16, 0x2F3A, 0x5F61, 0, - 16, 0x2F3B, 0x5F73, 0, - 16, 0x2F3C, 0x5FC3, 0, - 16, 0x2F3D, 0x6208, 0, - 16, 0x2F3E, 0x6236, 0, - 16, 0x2F3F, 0x624B, 0, - 16, 0x2F40, 0x652F, 0, - 16, 0x2F41, 0x6534, 0, - 16, 0x2F42, 0x6587, 0, - 16, 0x2F43, 0x6597, 0, - 16, 0x2F44, 0x65A4, 0, - 16, 0x2F45, 0x65B9, 0, - 16, 0x2F46, 0x65E0, 0, - 16, 0x2F47, 0x65E5, 0, - 16, 0x2F48, 0x66F0, 0, - 16, 0x2F49, 0x6708, 0, - 16, 0x2F4A, 0x6728, 0, - 16, 0x2F4B, 0x6B20, 0, - 16, 0x2F4C, 0x6B62, 0, - 16, 0x2F4D, 0x6B79, 0, - 16, 0x2F4E, 0x6BB3, 0, - 16, 0x2F4F, 0x6BCB, 0, - 16, 0x2F50, 0x6BD4, 0, - 16, 0x2F51, 0x6BDB, 0, - 16, 0x2F52, 0x6C0F, 0, - 16, 0x2F53, 0x6C14, 0, - 16, 0x2F54, 0x6C34, 0, - 16, 0x2F55, 0x706B, 0, - 16, 0x2F56, 0x722A, 0, - 16, 0x2F57, 0x7236, 0, - 16, 0x2F58, 0x723B, 0, - 16, 0x2F59, 0x723F, 0, - 16, 0x2F5A, 0x7247, 0, - 16, 0x2F5B, 0x7259, 0, - 16, 0x2F5C, 0x725B, 0, - 16, 0x2F5D, 0x72AC, 0, - 16, 0x2F5E, 0x7384, 0, - 16, 0x2F5F, 0x7389, 0, - 16, 0x2F60, 0x74DC, 0, - 16, 0x2F61, 0x74E6, 0, - 16, 0x2F62, 0x7518, 0, - 16, 0x2F63, 0x751F, 0, - 16, 0x2F64, 0x7528, 0, - 16, 0x2F65, 0x7530, 0, - 16, 0x2F66, 0x758B, 0, - 16, 0x2F67, 0x7592, 0, - 16, 0x2F68, 0x7676, 0, - 16, 0x2F69, 0x767D, 0, - 16, 0x2F6A, 0x76AE, 0, - 16, 0x2F6B, 0x76BF, 0, - 16, 0x2F6C, 0x76EE, 0, - 16, 0x2F6D, 0x77DB, 0, - 16, 0x2F6E, 0x77E2, 0, - 16, 0x2F6F, 0x77F3, 0, - 16, 0x2F70, 0x793A, 0, - 16, 0x2F71, 0x79B8, 0, - 16, 0x2F72, 0x79BE, 0, - 16, 0x2F73, 0x7A74, 0, - 16, 0x2F74, 0x7ACB, 0, - 16, 0x2F75, 0x7AF9, 0, - 16, 0x2F76, 0x7C73, 0, - 16, 0x2F77, 0x7CF8, 0, - 16, 0x2F78, 0x7F36, 0, - 16, 0x2F79, 0x7F51, 0, - 16, 0x2F7A, 0x7F8A, 0, - 16, 0x2F7B, 0x7FBD, 0, - 16, 0x2F7C, 0x8001, 0, - 16, 0x2F7D, 0x800C, 0, - 16, 0x2F7E, 0x8012, 0, - 16, 0x2F7F, 0x8033, 0, - 16, 0x2F80, 0x807F, 0, - 16, 0x2F81, 0x8089, 0, - 16, 0x2F82, 0x81E3, 0, - 16, 0x2F83, 0x81EA, 0, - 16, 0x2F84, 0x81F3, 0, - 16, 0x2F85, 0x81FC, 0, - 16, 0x2F86, 0x820C, 0, - 16, 0x2F87, 0x821B, 0, - 16, 0x2F88, 0x821F, 0, - 16, 0x2F89, 0x826E, 0, - 16, 0x2F8A, 0x8272, 0, - 16, 0x2F8B, 0x8278, 0, - 16, 0x2F8C, 0x864D, 0, - 16, 0x2F8D, 0x866B, 0, - 16, 0x2F8E, 0x8840, 0, - 16, 0x2F8F, 0x884C, 0, - 16, 0x2F90, 0x8863, 0, - 16, 0x2F91, 0x897E, 0, - 16, 0x2F92, 0x898B, 0, - 16, 0x2F93, 0x89D2, 0, - 16, 0x2F94, 0x8A00, 0, - 16, 0x2F95, 0x8C37, 0, - 16, 0x2F96, 0x8C46, 0, - 16, 0x2F97, 0x8C55, 0, - 16, 0x2F98, 0x8C78, 0, - 16, 0x2F99, 0x8C9D, 0, - 16, 0x2F9A, 0x8D64, 0, - 16, 0x2F9B, 0x8D70, 0, - 16, 0x2F9C, 0x8DB3, 0, - 16, 0x2F9D, 0x8EAB, 0, - 16, 0x2F9E, 0x8ECA, 0, - 16, 0x2F9F, 0x8F9B, 0, - 16, 0x2FA0, 0x8FB0, 0, - 16, 0x2FA1, 0x8FB5, 0, - 16, 0x2FA2, 0x9091, 0, - 16, 0x2FA3, 0x9149, 0, - 16, 0x2FA4, 0x91C6, 0, - 16, 0x2FA5, 0x91CC, 0, - 16, 0x2FA6, 0x91D1, 0, - 16, 0x2FA7, 0x9577, 0, - 16, 0x2FA8, 0x9580, 0, - 16, 0x2FA9, 0x961C, 0, - 16, 0x2FAA, 0x96B6, 0, - 16, 0x2FAB, 0x96B9, 0, - 16, 0x2FAC, 0x96E8, 0, - 16, 0x2FAD, 0x9751, 0, - 16, 0x2FAE, 0x975E, 0, - 16, 0x2FAF, 0x9762, 0, - 16, 0x2FB0, 0x9769, 0, - 16, 0x2FB1, 0x97CB, 0, - 16, 0x2FB2, 0x97ED, 0, - 16, 0x2FB3, 0x97F3, 0, - 16, 0x2FB4, 0x9801, 0, - 16, 0x2FB5, 0x98A8, 0, - 16, 0x2FB6, 0x98DB, 0, - 16, 0x2FB7, 0x98DF, 0, - 16, 0x2FB8, 0x9996, 0, - 16, 0x2FB9, 0x9999, 0, - 16, 0x2FBA, 0x99AC, 0, - 16, 0x2FBB, 0x9AA8, 0, - 16, 0x2FBC, 0x9AD8, 0, - 16, 0x2FBD, 0x9ADF, 0, - 16, 0x2FBE, 0x9B25, 0, - 16, 0x2FBF, 0x9B2F, 0, - 16, 0x2FC0, 0x9B32, 0, - 16, 0x2FC1, 0x9B3C, 0, - 16, 0x2FC2, 0x9B5A, 0, - 16, 0x2FC3, 0x9CE5, 0, - 16, 0x2FC4, 0x9E75, 0, - 16, 0x2FC5, 0x9E7F, 0, - 16, 0x2FC6, 0x9EA5, 0, - 16, 0x2FC7, 0x9EBB, 0, - 16, 0x2FC8, 0x9EC3, 0, - 16, 0x2FC9, 0x9ECD, 0, - 16, 0x2FCA, 0x9ED1, 0, - 16, 0x2FCB, 0x9EF9, 0, - 16, 0x2FCC, 0x9EFD, 0, - 16, 0x2FCD, 0x9F0E, 0, - 16, 0x2FCE, 0x9F13, 0, - 16, 0x2FCF, 0x9F20, 0, - 16, 0x2FD0, 0x9F3B, 0, - 16, 0x2FD1, 0x9F4A, 0, - 16, 0x2FD2, 0x9F52, 0, - 16, 0x2FD3, 0x9F8D, 0, - 16, 0x2FD4, 0x9F9C, 0, - 16, 0x2FD5, 0x9FA0, 0, - 12, 0x3000, 0x0020, 0, - 16, 0x3036, 0x3012, 0, - 16, 0x3038, 0x5341, 0, - 16, 0x3039, 0x5344, 0, - 16, 0x303A, 0x5345, 0, - 1, 0x304C, 0x304B, 0x3099, 0, - 1, 0x304E, 0x304D, 0x3099, 0, - 1, 0x3050, 0x304F, 0x3099, 0, - 1, 0x3052, 0x3051, 0x3099, 0, - 1, 0x3054, 0x3053, 0x3099, 0, - 1, 0x3056, 0x3055, 0x3099, 0, - 1, 0x3058, 0x3057, 0x3099, 0, - 1, 0x305A, 0x3059, 0x3099, 0, - 1, 0x305C, 0x305B, 0x3099, 0, - 1, 0x305E, 0x305D, 0x3099, 0, - 1, 0x3060, 0x305F, 0x3099, 0, - 1, 0x3062, 0x3061, 0x3099, 0, - 1, 0x3065, 0x3064, 0x3099, 0, - 1, 0x3067, 0x3066, 0x3099, 0, - 1, 0x3069, 0x3068, 0x3099, 0, - 1, 0x3070, 0x306F, 0x3099, 0, - 1, 0x3071, 0x306F, 0x309A, 0, - 1, 0x3073, 0x3072, 0x3099, 0, - 1, 0x3074, 0x3072, 0x309A, 0, - 1, 0x3076, 0x3075, 0x3099, 0, - 1, 0x3077, 0x3075, 0x309A, 0, - 1, 0x3079, 0x3078, 0x3099, 0, - 1, 0x307A, 0x3078, 0x309A, 0, - 1, 0x307C, 0x307B, 0x3099, 0, - 1, 0x307D, 0x307B, 0x309A, 0, - 1, 0x3094, 0x3046, 0x3099, 0, - 16, 0x309B, 0x0020, 0x3099, 0, - 16, 0x309C, 0x0020, 0x309A, 0, - 1, 0x309E, 0x309D, 0x3099, 0, - 11, 0x309F, 0x3088, 0x308A, 0, - 1, 0x30AC, 0x30AB, 0x3099, 0, - 1, 0x30AE, 0x30AD, 0x3099, 0, - 1, 0x30B0, 0x30AF, 0x3099, 0, - 1, 0x30B2, 0x30B1, 0x3099, 0, - 1, 0x30B4, 0x30B3, 0x3099, 0, - 1, 0x30B6, 0x30B5, 0x3099, 0, - 1, 0x30B8, 0x30B7, 0x3099, 0, - 1, 0x30BA, 0x30B9, 0x3099, 0, - 1, 0x30BC, 0x30BB, 0x3099, 0, - 1, 0x30BE, 0x30BD, 0x3099, 0, - 1, 0x30C0, 0x30BF, 0x3099, 0, - 1, 0x30C2, 0x30C1, 0x3099, 0, - 1, 0x30C5, 0x30C4, 0x3099, 0, - 1, 0x30C7, 0x30C6, 0x3099, 0, - 1, 0x30C9, 0x30C8, 0x3099, 0, - 1, 0x30D0, 0x30CF, 0x3099, 0, - 1, 0x30D1, 0x30CF, 0x309A, 0, - 1, 0x30D3, 0x30D2, 0x3099, 0, - 1, 0x30D4, 0x30D2, 0x309A, 0, - 1, 0x30D6, 0x30D5, 0x3099, 0, - 1, 0x30D7, 0x30D5, 0x309A, 0, - 1, 0x30D9, 0x30D8, 0x3099, 0, - 1, 0x30DA, 0x30D8, 0x309A, 0, - 1, 0x30DC, 0x30DB, 0x3099, 0, - 1, 0x30DD, 0x30DB, 0x309A, 0, - 1, 0x30F4, 0x30A6, 0x3099, 0, - 1, 0x30F7, 0x30EF, 0x3099, 0, - 1, 0x30F8, 0x30F0, 0x3099, 0, - 1, 0x30F9, 0x30F1, 0x3099, 0, - 1, 0x30FA, 0x30F2, 0x3099, 0, - 1, 0x30FE, 0x30FD, 0x3099, 0, - 11, 0x30FF, 0x30B3, 0x30C8, 0, - 16, 0x3131, 0x1100, 0, - 16, 0x3132, 0x1101, 0, - 16, 0x3133, 0x11AA, 0, - 16, 0x3134, 0x1102, 0, - 16, 0x3135, 0x11AC, 0, - 16, 0x3136, 0x11AD, 0, - 16, 0x3137, 0x1103, 0, - 16, 0x3138, 0x1104, 0, - 16, 0x3139, 0x1105, 0, - 16, 0x313A, 0x11B0, 0, - 16, 0x313B, 0x11B1, 0, - 16, 0x313C, 0x11B2, 0, - 16, 0x313D, 0x11B3, 0, - 16, 0x313E, 0x11B4, 0, - 16, 0x313F, 0x11B5, 0, - 16, 0x3140, 0x111A, 0, - 16, 0x3141, 0x1106, 0, - 16, 0x3142, 0x1107, 0, - 16, 0x3143, 0x1108, 0, - 16, 0x3144, 0x1121, 0, - 16, 0x3145, 0x1109, 0, - 16, 0x3146, 0x110A, 0, - 16, 0x3147, 0x110B, 0, - 16, 0x3148, 0x110C, 0, - 16, 0x3149, 0x110D, 0, - 16, 0x314A, 0x110E, 0, - 16, 0x314B, 0x110F, 0, - 16, 0x314C, 0x1110, 0, - 16, 0x314D, 0x1111, 0, - 16, 0x314E, 0x1112, 0, - 16, 0x314F, 0x1161, 0, - 16, 0x3150, 0x1162, 0, - 16, 0x3151, 0x1163, 0, - 16, 0x3152, 0x1164, 0, - 16, 0x3153, 0x1165, 0, - 16, 0x3154, 0x1166, 0, - 16, 0x3155, 0x1167, 0, - 16, 0x3156, 0x1168, 0, - 16, 0x3157, 0x1169, 0, - 16, 0x3158, 0x116A, 0, - 16, 0x3159, 0x116B, 0, - 16, 0x315A, 0x116C, 0, - 16, 0x315B, 0x116D, 0, - 16, 0x315C, 0x116E, 0, - 16, 0x315D, 0x116F, 0, - 16, 0x315E, 0x1170, 0, - 16, 0x315F, 0x1171, 0, - 16, 0x3160, 0x1172, 0, - 16, 0x3161, 0x1173, 0, - 16, 0x3162, 0x1174, 0, - 16, 0x3163, 0x1175, 0, - 16, 0x3164, 0x1160, 0, - 16, 0x3165, 0x1114, 0, - 16, 0x3166, 0x1115, 0, - 16, 0x3167, 0x11C7, 0, - 16, 0x3168, 0x11C8, 0, - 16, 0x3169, 0x11CC, 0, - 16, 0x316A, 0x11CE, 0, - 16, 0x316B, 0x11D3, 0, - 16, 0x316C, 0x11D7, 0, - 16, 0x316D, 0x11D9, 0, - 16, 0x316E, 0x111C, 0, - 16, 0x316F, 0x11DD, 0, - 16, 0x3170, 0x11DF, 0, - 16, 0x3171, 0x111D, 0, - 16, 0x3172, 0x111E, 0, - 16, 0x3173, 0x1120, 0, - 16, 0x3174, 0x1122, 0, - 16, 0x3175, 0x1123, 0, - 16, 0x3176, 0x1127, 0, - 16, 0x3177, 0x1129, 0, - 16, 0x3178, 0x112B, 0, - 16, 0x3179, 0x112C, 0, - 16, 0x317A, 0x112D, 0, - 16, 0x317B, 0x112E, 0, - 16, 0x317C, 0x112F, 0, - 16, 0x317D, 0x1132, 0, - 16, 0x317E, 0x1136, 0, - 16, 0x317F, 0x1140, 0, - 16, 0x3180, 0x1147, 0, - 16, 0x3181, 0x114C, 0, - 16, 0x3182, 0x11F1, 0, - 16, 0x3183, 0x11F2, 0, - 16, 0x3184, 0x1157, 0, - 16, 0x3185, 0x1158, 0, - 16, 0x3186, 0x1159, 0, - 16, 0x3187, 0x1184, 0, - 16, 0x3188, 0x1185, 0, - 16, 0x3189, 0x1188, 0, - 16, 0x318A, 0x1191, 0, - 16, 0x318B, 0x1192, 0, - 16, 0x318C, 0x1194, 0, - 16, 0x318D, 0x119E, 0, - 16, 0x318E, 0x11A1, 0, - 9, 0x3192, 0x4E00, 0, - 9, 0x3193, 0x4E8C, 0, - 9, 0x3194, 0x4E09, 0, - 9, 0x3195, 0x56DB, 0, - 9, 0x3196, 0x4E0A, 0, - 9, 0x3197, 0x4E2D, 0, - 9, 0x3198, 0x4E0B, 0, - 9, 0x3199, 0x7532, 0, - 9, 0x319A, 0x4E59, 0, - 9, 0x319B, 0x4E19, 0, - 9, 0x319C, 0x4E01, 0, - 9, 0x319D, 0x5929, 0, - 9, 0x319E, 0x5730, 0, - 9, 0x319F, 0x4EBA, 0, - 16, 0x3200, 0x0028, 0x1100, 0x0029, 0, - 16, 0x3201, 0x0028, 0x1102, 0x0029, 0, - 16, 0x3202, 0x0028, 0x1103, 0x0029, 0, - 16, 0x3203, 0x0028, 0x1105, 0x0029, 0, - 16, 0x3204, 0x0028, 0x1106, 0x0029, 0, - 16, 0x3205, 0x0028, 0x1107, 0x0029, 0, - 16, 0x3206, 0x0028, 0x1109, 0x0029, 0, - 16, 0x3207, 0x0028, 0x110B, 0x0029, 0, - 16, 0x3208, 0x0028, 0x110C, 0x0029, 0, - 16, 0x3209, 0x0028, 0x110E, 0x0029, 0, - 16, 0x320A, 0x0028, 0x110F, 0x0029, 0, - 16, 0x320B, 0x0028, 0x1110, 0x0029, 0, - 16, 0x320C, 0x0028, 0x1111, 0x0029, 0, - 16, 0x320D, 0x0028, 0x1112, 0x0029, 0, - 16, 0x320E, 0x0028, 0x1100, 0x1161, 0x0029, 0, - 16, 0x320F, 0x0028, 0x1102, 0x1161, 0x0029, 0, - 16, 0x3210, 0x0028, 0x1103, 0x1161, 0x0029, 0, - 16, 0x3211, 0x0028, 0x1105, 0x1161, 0x0029, 0, - 16, 0x3212, 0x0028, 0x1106, 0x1161, 0x0029, 0, - 16, 0x3213, 0x0028, 0x1107, 0x1161, 0x0029, 0, - 16, 0x3214, 0x0028, 0x1109, 0x1161, 0x0029, 0, - 16, 0x3215, 0x0028, 0x110B, 0x1161, 0x0029, 0, - 16, 0x3216, 0x0028, 0x110C, 0x1161, 0x0029, 0, - 16, 0x3217, 0x0028, 0x110E, 0x1161, 0x0029, 0, - 16, 0x3218, 0x0028, 0x110F, 0x1161, 0x0029, 0, - 16, 0x3219, 0x0028, 0x1110, 0x1161, 0x0029, 0, - 16, 0x321A, 0x0028, 0x1111, 0x1161, 0x0029, 0, - 16, 0x321B, 0x0028, 0x1112, 0x1161, 0x0029, 0, - 16, 0x321C, 0x0028, 0x110C, 0x116E, 0x0029, 0, - 16, 0x3220, 0x0028, 0x4E00, 0x0029, 0, - 16, 0x3221, 0x0028, 0x4E8C, 0x0029, 0, - 16, 0x3222, 0x0028, 0x4E09, 0x0029, 0, - 16, 0x3223, 0x0028, 0x56DB, 0x0029, 0, - 16, 0x3224, 0x0028, 0x4E94, 0x0029, 0, - 16, 0x3225, 0x0028, 0x516D, 0x0029, 0, - 16, 0x3226, 0x0028, 0x4E03, 0x0029, 0, - 16, 0x3227, 0x0028, 0x516B, 0x0029, 0, - 16, 0x3228, 0x0028, 0x4E5D, 0x0029, 0, - 16, 0x3229, 0x0028, 0x5341, 0x0029, 0, - 16, 0x322A, 0x0028, 0x6708, 0x0029, 0, - 16, 0x322B, 0x0028, 0x706B, 0x0029, 0, - 16, 0x322C, 0x0028, 0x6C34, 0x0029, 0, - 16, 0x322D, 0x0028, 0x6728, 0x0029, 0, - 16, 0x322E, 0x0028, 0x91D1, 0x0029, 0, - 16, 0x322F, 0x0028, 0x571F, 0x0029, 0, - 16, 0x3230, 0x0028, 0x65E5, 0x0029, 0, - 16, 0x3231, 0x0028, 0x682A, 0x0029, 0, - 16, 0x3232, 0x0028, 0x6709, 0x0029, 0, - 16, 0x3233, 0x0028, 0x793E, 0x0029, 0, - 16, 0x3234, 0x0028, 0x540D, 0x0029, 0, - 16, 0x3235, 0x0028, 0x7279, 0x0029, 0, - 16, 0x3236, 0x0028, 0x8CA1, 0x0029, 0, - 16, 0x3237, 0x0028, 0x795D, 0x0029, 0, - 16, 0x3238, 0x0028, 0x52B4, 0x0029, 0, - 16, 0x3239, 0x0028, 0x4EE3, 0x0029, 0, - 16, 0x323A, 0x0028, 0x547C, 0x0029, 0, - 16, 0x323B, 0x0028, 0x5B66, 0x0029, 0, - 16, 0x323C, 0x0028, 0x76E3, 0x0029, 0, - 16, 0x323D, 0x0028, 0x4F01, 0x0029, 0, - 16, 0x323E, 0x0028, 0x8CC7, 0x0029, 0, - 16, 0x323F, 0x0028, 0x5354, 0x0029, 0, - 16, 0x3240, 0x0028, 0x796D, 0x0029, 0, - 16, 0x3241, 0x0028, 0x4F11, 0x0029, 0, - 16, 0x3242, 0x0028, 0x81EA, 0x0029, 0, - 16, 0x3243, 0x0028, 0x81F3, 0x0029, 0, - 8, 0x3251, 0x0032, 0x0031, 0, - 8, 0x3252, 0x0032, 0x0032, 0, - 8, 0x3253, 0x0032, 0x0033, 0, - 8, 0x3254, 0x0032, 0x0034, 0, - 8, 0x3255, 0x0032, 0x0035, 0, - 8, 0x3256, 0x0032, 0x0036, 0, - 8, 0x3257, 0x0032, 0x0037, 0, - 8, 0x3258, 0x0032, 0x0038, 0, - 8, 0x3259, 0x0032, 0x0039, 0, - 8, 0x325A, 0x0033, 0x0030, 0, - 8, 0x325B, 0x0033, 0x0031, 0, - 8, 0x325C, 0x0033, 0x0032, 0, - 8, 0x325D, 0x0033, 0x0033, 0, - 8, 0x325E, 0x0033, 0x0034, 0, - 8, 0x325F, 0x0033, 0x0035, 0, - 8, 0x3260, 0x1100, 0, - 8, 0x3261, 0x1102, 0, - 8, 0x3262, 0x1103, 0, - 8, 0x3263, 0x1105, 0, - 8, 0x3264, 0x1106, 0, - 8, 0x3265, 0x1107, 0, - 8, 0x3266, 0x1109, 0, - 8, 0x3267, 0x110B, 0, - 8, 0x3268, 0x110C, 0, - 8, 0x3269, 0x110E, 0, - 8, 0x326A, 0x110F, 0, - 8, 0x326B, 0x1110, 0, - 8, 0x326C, 0x1111, 0, - 8, 0x326D, 0x1112, 0, - 8, 0x326E, 0x1100, 0x1161, 0, - 8, 0x326F, 0x1102, 0x1161, 0, - 8, 0x3270, 0x1103, 0x1161, 0, - 8, 0x3271, 0x1105, 0x1161, 0, - 8, 0x3272, 0x1106, 0x1161, 0, - 8, 0x3273, 0x1107, 0x1161, 0, - 8, 0x3274, 0x1109, 0x1161, 0, - 8, 0x3275, 0x110B, 0x1161, 0, - 8, 0x3276, 0x110C, 0x1161, 0, - 8, 0x3277, 0x110E, 0x1161, 0, - 8, 0x3278, 0x110F, 0x1161, 0, - 8, 0x3279, 0x1110, 0x1161, 0, - 8, 0x327A, 0x1111, 0x1161, 0, - 8, 0x327B, 0x1112, 0x1161, 0, - 8, 0x3280, 0x4E00, 0, - 8, 0x3281, 0x4E8C, 0, - 8, 0x3282, 0x4E09, 0, - 8, 0x3283, 0x56DB, 0, - 8, 0x3284, 0x4E94, 0, - 8, 0x3285, 0x516D, 0, - 8, 0x3286, 0x4E03, 0, - 8, 0x3287, 0x516B, 0, - 8, 0x3288, 0x4E5D, 0, - 8, 0x3289, 0x5341, 0, - 8, 0x328A, 0x6708, 0, - 8, 0x328B, 0x706B, 0, - 8, 0x328C, 0x6C34, 0, - 8, 0x328D, 0x6728, 0, - 8, 0x328E, 0x91D1, 0, - 8, 0x328F, 0x571F, 0, - 8, 0x3290, 0x65E5, 0, - 8, 0x3291, 0x682A, 0, - 8, 0x3292, 0x6709, 0, - 8, 0x3293, 0x793E, 0, - 8, 0x3294, 0x540D, 0, - 8, 0x3295, 0x7279, 0, - 8, 0x3296, 0x8CA1, 0, - 8, 0x3297, 0x795D, 0, - 8, 0x3298, 0x52B4, 0, - 8, 0x3299, 0x79D8, 0, - 8, 0x329A, 0x7537, 0, - 8, 0x329B, 0x5973, 0, - 8, 0x329C, 0x9069, 0, - 8, 0x329D, 0x512A, 0, - 8, 0x329E, 0x5370, 0, - 8, 0x329F, 0x6CE8, 0, - 8, 0x32A0, 0x9805, 0, - 8, 0x32A1, 0x4F11, 0, - 8, 0x32A2, 0x5199, 0, - 8, 0x32A3, 0x6B63, 0, - 8, 0x32A4, 0x4E0A, 0, - 8, 0x32A5, 0x4E2D, 0, - 8, 0x32A6, 0x4E0B, 0, - 8, 0x32A7, 0x5DE6, 0, - 8, 0x32A8, 0x53F3, 0, - 8, 0x32A9, 0x533B, 0, - 8, 0x32AA, 0x5B97, 0, - 8, 0x32AB, 0x5B66, 0, - 8, 0x32AC, 0x76E3, 0, - 8, 0x32AD, 0x4F01, 0, - 8, 0x32AE, 0x8CC7, 0, - 8, 0x32AF, 0x5354, 0, - 8, 0x32B0, 0x591C, 0, - 8, 0x32B1, 0x0033, 0x0036, 0, - 8, 0x32B2, 0x0033, 0x0037, 0, - 8, 0x32B3, 0x0033, 0x0038, 0, - 8, 0x32B4, 0x0033, 0x0039, 0, - 8, 0x32B5, 0x0034, 0x0030, 0, - 8, 0x32B6, 0x0034, 0x0031, 0, - 8, 0x32B7, 0x0034, 0x0032, 0, - 8, 0x32B8, 0x0034, 0x0033, 0, - 8, 0x32B9, 0x0034, 0x0034, 0, - 8, 0x32BA, 0x0034, 0x0035, 0, - 8, 0x32BB, 0x0034, 0x0036, 0, - 8, 0x32BC, 0x0034, 0x0037, 0, - 8, 0x32BD, 0x0034, 0x0038, 0, - 8, 0x32BE, 0x0034, 0x0039, 0, - 8, 0x32BF, 0x0035, 0x0030, 0, - 16, 0x32C0, 0x0031, 0x6708, 0, - 16, 0x32C1, 0x0032, 0x6708, 0, - 16, 0x32C2, 0x0033, 0x6708, 0, - 16, 0x32C3, 0x0034, 0x6708, 0, - 16, 0x32C4, 0x0035, 0x6708, 0, - 16, 0x32C5, 0x0036, 0x6708, 0, - 16, 0x32C6, 0x0037, 0x6708, 0, - 16, 0x32C7, 0x0038, 0x6708, 0, - 16, 0x32C8, 0x0039, 0x6708, 0, - 16, 0x32C9, 0x0031, 0x0030, 0x6708, 0, - 16, 0x32CA, 0x0031, 0x0031, 0x6708, 0, - 16, 0x32CB, 0x0031, 0x0032, 0x6708, 0, - 8, 0x32D0, 0x30A2, 0, - 8, 0x32D1, 0x30A4, 0, - 8, 0x32D2, 0x30A6, 0, - 8, 0x32D3, 0x30A8, 0, - 8, 0x32D4, 0x30AA, 0, - 8, 0x32D5, 0x30AB, 0, - 8, 0x32D6, 0x30AD, 0, - 8, 0x32D7, 0x30AF, 0, - 8, 0x32D8, 0x30B1, 0, - 8, 0x32D9, 0x30B3, 0, - 8, 0x32DA, 0x30B5, 0, - 8, 0x32DB, 0x30B7, 0, - 8, 0x32DC, 0x30B9, 0, - 8, 0x32DD, 0x30BB, 0, - 8, 0x32DE, 0x30BD, 0, - 8, 0x32DF, 0x30BF, 0, - 8, 0x32E0, 0x30C1, 0, - 8, 0x32E1, 0x30C4, 0, - 8, 0x32E2, 0x30C6, 0, - 8, 0x32E3, 0x30C8, 0, - 8, 0x32E4, 0x30CA, 0, - 8, 0x32E5, 0x30CB, 0, - 8, 0x32E6, 0x30CC, 0, - 8, 0x32E7, 0x30CD, 0, - 8, 0x32E8, 0x30CE, 0, - 8, 0x32E9, 0x30CF, 0, - 8, 0x32EA, 0x30D2, 0, - 8, 0x32EB, 0x30D5, 0, - 8, 0x32EC, 0x30D8, 0, - 8, 0x32ED, 0x30DB, 0, - 8, 0x32EE, 0x30DE, 0, - 8, 0x32EF, 0x30DF, 0, - 8, 0x32F0, 0x30E0, 0, - 8, 0x32F1, 0x30E1, 0, - 8, 0x32F2, 0x30E2, 0, - 8, 0x32F3, 0x30E4, 0, - 8, 0x32F4, 0x30E6, 0, - 8, 0x32F5, 0x30E8, 0, - 8, 0x32F6, 0x30E9, 0, - 8, 0x32F7, 0x30EA, 0, - 8, 0x32F8, 0x30EB, 0, - 8, 0x32F9, 0x30EC, 0, - 8, 0x32FA, 0x30ED, 0, - 8, 0x32FB, 0x30EF, 0, - 8, 0x32FC, 0x30F0, 0, - 8, 0x32FD, 0x30F1, 0, - 8, 0x32FE, 0x30F2, 0, - 15, 0x3300, 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0, - 15, 0x3301, 0x30A2, 0x30EB, 0x30D5, 0x30A1, 0, - 15, 0x3302, 0x30A2, 0x30F3, 0x30DA, 0x30A2, 0, - 15, 0x3303, 0x30A2, 0x30FC, 0x30EB, 0, - 15, 0x3304, 0x30A4, 0x30CB, 0x30F3, 0x30B0, 0, - 15, 0x3305, 0x30A4, 0x30F3, 0x30C1, 0, - 15, 0x3306, 0x30A6, 0x30A9, 0x30F3, 0, - 15, 0x3307, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, 0, - 15, 0x3308, 0x30A8, 0x30FC, 0x30AB, 0x30FC, 0, - 15, 0x3309, 0x30AA, 0x30F3, 0x30B9, 0, - 15, 0x330A, 0x30AA, 0x30FC, 0x30E0, 0, - 15, 0x330B, 0x30AB, 0x30A4, 0x30EA, 0, - 15, 0x330C, 0x30AB, 0x30E9, 0x30C3, 0x30C8, 0, - 15, 0x330D, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0, - 15, 0x330E, 0x30AC, 0x30ED, 0x30F3, 0, - 15, 0x330F, 0x30AC, 0x30F3, 0x30DE, 0, - 15, 0x3310, 0x30AE, 0x30AC, 0, - 15, 0x3311, 0x30AE, 0x30CB, 0x30FC, 0, - 15, 0x3312, 0x30AD, 0x30E5, 0x30EA, 0x30FC, 0, - 15, 0x3313, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0, - 15, 0x3314, 0x30AD, 0x30ED, 0, - 15, 0x3315, 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0, - 15, 0x3316, 0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0, - 15, 0x3317, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0, - 15, 0x3318, 0x30B0, 0x30E9, 0x30E0, 0, - 15, 0x3319, 0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3, 0, - 15, 0x331A, 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED, 0, - 15, 0x331B, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0, - 15, 0x331C, 0x30B1, 0x30FC, 0x30B9, 0, - 15, 0x331D, 0x30B3, 0x30EB, 0x30CA, 0, - 15, 0x331E, 0x30B3, 0x30FC, 0x30DD, 0, - 15, 0x331F, 0x30B5, 0x30A4, 0x30AF, 0x30EB, 0, - 15, 0x3320, 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, 0, - 15, 0x3321, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0, - 15, 0x3322, 0x30BB, 0x30F3, 0x30C1, 0, - 15, 0x3323, 0x30BB, 0x30F3, 0x30C8, 0, - 15, 0x3324, 0x30C0, 0x30FC, 0x30B9, 0, - 15, 0x3325, 0x30C7, 0x30B7, 0, - 15, 0x3326, 0x30C9, 0x30EB, 0, - 15, 0x3327, 0x30C8, 0x30F3, 0, - 15, 0x3328, 0x30CA, 0x30CE, 0, - 15, 0x3329, 0x30CE, 0x30C3, 0x30C8, 0, - 15, 0x332A, 0x30CF, 0x30A4, 0x30C4, 0, - 15, 0x332B, 0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8, 0, - 15, 0x332C, 0x30D1, 0x30FC, 0x30C4, 0, - 15, 0x332D, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0, - 15, 0x332E, 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0, - 15, 0x332F, 0x30D4, 0x30AF, 0x30EB, 0, - 15, 0x3330, 0x30D4, 0x30B3, 0, - 15, 0x3331, 0x30D3, 0x30EB, 0, - 15, 0x3332, 0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9, 0, - 15, 0x3333, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0, - 15, 0x3334, 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB, 0, - 15, 0x3335, 0x30D5, 0x30E9, 0x30F3, 0, - 15, 0x3336, 0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB, 0, - 15, 0x3337, 0x30DA, 0x30BD, 0, - 15, 0x3338, 0x30DA, 0x30CB, 0x30D2, 0, - 15, 0x3339, 0x30D8, 0x30EB, 0x30C4, 0, - 15, 0x333A, 0x30DA, 0x30F3, 0x30B9, 0, - 15, 0x333B, 0x30DA, 0x30FC, 0x30B8, 0, - 15, 0x333C, 0x30D9, 0x30FC, 0x30BF, 0, - 15, 0x333D, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0, - 15, 0x333E, 0x30DC, 0x30EB, 0x30C8, 0, - 15, 0x333F, 0x30DB, 0x30F3, 0, - 15, 0x3340, 0x30DD, 0x30F3, 0x30C9, 0, - 15, 0x3341, 0x30DB, 0x30FC, 0x30EB, 0, - 15, 0x3342, 0x30DB, 0x30FC, 0x30F3, 0, - 15, 0x3343, 0x30DE, 0x30A4, 0x30AF, 0x30ED, 0, - 15, 0x3344, 0x30DE, 0x30A4, 0x30EB, 0, - 15, 0x3345, 0x30DE, 0x30C3, 0x30CF, 0, - 15, 0x3346, 0x30DE, 0x30EB, 0x30AF, 0, - 15, 0x3347, 0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3, 0, - 15, 0x3348, 0x30DF, 0x30AF, 0x30ED, 0x30F3, 0, - 15, 0x3349, 0x30DF, 0x30EA, 0, - 15, 0x334A, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, 0, - 15, 0x334B, 0x30E1, 0x30AC, 0, - 15, 0x334C, 0x30E1, 0x30AC, 0x30C8, 0x30F3, 0, - 15, 0x334D, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0, - 15, 0x334E, 0x30E4, 0x30FC, 0x30C9, 0, - 15, 0x334F, 0x30E4, 0x30FC, 0x30EB, 0, - 15, 0x3350, 0x30E6, 0x30A2, 0x30F3, 0, - 15, 0x3351, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0, - 15, 0x3352, 0x30EA, 0x30E9, 0, - 15, 0x3353, 0x30EB, 0x30D4, 0x30FC, 0, - 15, 0x3354, 0x30EB, 0x30FC, 0x30D6, 0x30EB, 0, - 15, 0x3355, 0x30EC, 0x30E0, 0, - 15, 0x3356, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0, - 15, 0x3357, 0x30EF, 0x30C3, 0x30C8, 0, - 16, 0x3358, 0x0030, 0x70B9, 0, - 16, 0x3359, 0x0031, 0x70B9, 0, - 16, 0x335A, 0x0032, 0x70B9, 0, - 16, 0x335B, 0x0033, 0x70B9, 0, - 16, 0x335C, 0x0034, 0x70B9, 0, - 16, 0x335D, 0x0035, 0x70B9, 0, - 16, 0x335E, 0x0036, 0x70B9, 0, - 16, 0x335F, 0x0037, 0x70B9, 0, - 16, 0x3360, 0x0038, 0x70B9, 0, - 16, 0x3361, 0x0039, 0x70B9, 0, - 16, 0x3362, 0x0031, 0x0030, 0x70B9, 0, - 16, 0x3363, 0x0031, 0x0031, 0x70B9, 0, - 16, 0x3364, 0x0031, 0x0032, 0x70B9, 0, - 16, 0x3365, 0x0031, 0x0033, 0x70B9, 0, - 16, 0x3366, 0x0031, 0x0034, 0x70B9, 0, - 16, 0x3367, 0x0031, 0x0035, 0x70B9, 0, - 16, 0x3368, 0x0031, 0x0036, 0x70B9, 0, - 16, 0x3369, 0x0031, 0x0037, 0x70B9, 0, - 16, 0x336A, 0x0031, 0x0038, 0x70B9, 0, - 16, 0x336B, 0x0031, 0x0039, 0x70B9, 0, - 16, 0x336C, 0x0032, 0x0030, 0x70B9, 0, - 16, 0x336D, 0x0032, 0x0031, 0x70B9, 0, - 16, 0x336E, 0x0032, 0x0032, 0x70B9, 0, - 16, 0x336F, 0x0032, 0x0033, 0x70B9, 0, - 16, 0x3370, 0x0032, 0x0034, 0x70B9, 0, - 15, 0x3371, 0x0068, 0x0050, 0x0061, 0, - 15, 0x3372, 0x0064, 0x0061, 0, - 15, 0x3373, 0x0041, 0x0055, 0, - 15, 0x3374, 0x0062, 0x0061, 0x0072, 0, - 15, 0x3375, 0x006F, 0x0056, 0, - 15, 0x3376, 0x0070, 0x0063, 0, - 15, 0x337B, 0x5E73, 0x6210, 0, - 15, 0x337C, 0x662D, 0x548C, 0, - 15, 0x337D, 0x5927, 0x6B63, 0, - 15, 0x337E, 0x660E, 0x6CBB, 0, - 15, 0x337F, 0x682A, 0x5F0F, 0x4F1A, 0x793E, 0, - 15, 0x3380, 0x0070, 0x0041, 0, - 15, 0x3381, 0x006E, 0x0041, 0, - 15, 0x3382, 0x03BC, 0x0041, 0, - 15, 0x3383, 0x006D, 0x0041, 0, - 15, 0x3384, 0x006B, 0x0041, 0, - 15, 0x3385, 0x004B, 0x0042, 0, - 15, 0x3386, 0x004D, 0x0042, 0, - 15, 0x3387, 0x0047, 0x0042, 0, - 15, 0x3388, 0x0063, 0x0061, 0x006C, 0, - 15, 0x3389, 0x006B, 0x0063, 0x0061, 0x006C, 0, - 15, 0x338A, 0x0070, 0x0046, 0, - 15, 0x338B, 0x006E, 0x0046, 0, - 15, 0x338C, 0x03BC, 0x0046, 0, - 15, 0x338D, 0x03BC, 0x0067, 0, - 15, 0x338E, 0x006D, 0x0067, 0, - 15, 0x338F, 0x006B, 0x0067, 0, - 15, 0x3390, 0x0048, 0x007A, 0, - 15, 0x3391, 0x006B, 0x0048, 0x007A, 0, - 15, 0x3392, 0x004D, 0x0048, 0x007A, 0, - 15, 0x3393, 0x0047, 0x0048, 0x007A, 0, - 15, 0x3394, 0x0054, 0x0048, 0x007A, 0, - 15, 0x3395, 0x03BC, 0x2113, 0, - 15, 0x3396, 0x006D, 0x2113, 0, - 15, 0x3397, 0x0064, 0x2113, 0, - 15, 0x3398, 0x006B, 0x2113, 0, - 15, 0x3399, 0x0066, 0x006D, 0, - 15, 0x339A, 0x006E, 0x006D, 0, - 15, 0x339B, 0x03BC, 0x006D, 0, - 15, 0x339C, 0x006D, 0x006D, 0, - 15, 0x339D, 0x0063, 0x006D, 0, - 15, 0x339E, 0x006B, 0x006D, 0, - 15, 0x339F, 0x006D, 0x006D, 0x00B2, 0, - 15, 0x33A0, 0x0063, 0x006D, 0x00B2, 0, - 15, 0x33A1, 0x006D, 0x00B2, 0, - 15, 0x33A2, 0x006B, 0x006D, 0x00B2, 0, - 15, 0x33A3, 0x006D, 0x006D, 0x00B3, 0, - 15, 0x33A4, 0x0063, 0x006D, 0x00B3, 0, - 15, 0x33A5, 0x006D, 0x00B3, 0, - 15, 0x33A6, 0x006B, 0x006D, 0x00B3, 0, - 15, 0x33A7, 0x006D, 0x2215, 0x0073, 0, - 15, 0x33A8, 0x006D, 0x2215, 0x0073, 0x00B2, 0, - 15, 0x33A9, 0x0050, 0x0061, 0, - 15, 0x33AA, 0x006B, 0x0050, 0x0061, 0, - 15, 0x33AB, 0x004D, 0x0050, 0x0061, 0, - 15, 0x33AC, 0x0047, 0x0050, 0x0061, 0, - 15, 0x33AD, 0x0072, 0x0061, 0x0064, 0, - 15, 0x33AE, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0, - 15, 0x33AF, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x00B2, 0, - 15, 0x33B0, 0x0070, 0x0073, 0, - 15, 0x33B1, 0x006E, 0x0073, 0, - 15, 0x33B2, 0x03BC, 0x0073, 0, - 15, 0x33B3, 0x006D, 0x0073, 0, - 15, 0x33B4, 0x0070, 0x0056, 0, - 15, 0x33B5, 0x006E, 0x0056, 0, - 15, 0x33B6, 0x03BC, 0x0056, 0, - 15, 0x33B7, 0x006D, 0x0056, 0, - 15, 0x33B8, 0x006B, 0x0056, 0, - 15, 0x33B9, 0x004D, 0x0056, 0, - 15, 0x33BA, 0x0070, 0x0057, 0, - 15, 0x33BB, 0x006E, 0x0057, 0, - 15, 0x33BC, 0x03BC, 0x0057, 0, - 15, 0x33BD, 0x006D, 0x0057, 0, - 15, 0x33BE, 0x006B, 0x0057, 0, - 15, 0x33BF, 0x004D, 0x0057, 0, - 15, 0x33C0, 0x006B, 0x03A9, 0, - 15, 0x33C1, 0x004D, 0x03A9, 0, - 15, 0x33C2, 0x0061, 0x002E, 0x006D, 0x002E, 0, - 15, 0x33C3, 0x0042, 0x0071, 0, - 15, 0x33C4, 0x0063, 0x0063, 0, - 15, 0x33C5, 0x0063, 0x0064, 0, - 15, 0x33C6, 0x0043, 0x2215, 0x006B, 0x0067, 0, - 15, 0x33C7, 0x0043, 0x006F, 0x002E, 0, - 15, 0x33C8, 0x0064, 0x0042, 0, - 15, 0x33C9, 0x0047, 0x0079, 0, - 15, 0x33CA, 0x0068, 0x0061, 0, - 15, 0x33CB, 0x0048, 0x0050, 0, - 15, 0x33CC, 0x0069, 0x006E, 0, - 15, 0x33CD, 0x004B, 0x004B, 0, - 15, 0x33CE, 0x004B, 0x004D, 0, - 15, 0x33CF, 0x006B, 0x0074, 0, - 15, 0x33D0, 0x006C, 0x006D, 0, - 15, 0x33D1, 0x006C, 0x006E, 0, - 15, 0x33D2, 0x006C, 0x006F, 0x0067, 0, - 15, 0x33D3, 0x006C, 0x0078, 0, - 15, 0x33D4, 0x006D, 0x0062, 0, - 15, 0x33D5, 0x006D, 0x0069, 0x006C, 0, - 15, 0x33D6, 0x006D, 0x006F, 0x006C, 0, - 15, 0x33D7, 0x0050, 0x0048, 0, - 15, 0x33D8, 0x0070, 0x002E, 0x006D, 0x002E, 0, - 15, 0x33D9, 0x0050, 0x0050, 0x004D, 0, - 15, 0x33DA, 0x0050, 0x0052, 0, - 15, 0x33DB, 0x0073, 0x0072, 0, - 15, 0x33DC, 0x0053, 0x0076, 0, - 15, 0x33DD, 0x0057, 0x0062, 0, - 16, 0x33E0, 0x0031, 0x65E5, 0, - 16, 0x33E1, 0x0032, 0x65E5, 0, - 16, 0x33E2, 0x0033, 0x65E5, 0, - 16, 0x33E3, 0x0034, 0x65E5, 0, - 16, 0x33E4, 0x0035, 0x65E5, 0, - 16, 0x33E5, 0x0036, 0x65E5, 0, - 16, 0x33E6, 0x0037, 0x65E5, 0, - 16, 0x33E7, 0x0038, 0x65E5, 0, - 16, 0x33E8, 0x0039, 0x65E5, 0, - 16, 0x33E9, 0x0031, 0x0030, 0x65E5, 0, - 16, 0x33EA, 0x0031, 0x0031, 0x65E5, 0, - 16, 0x33EB, 0x0031, 0x0032, 0x65E5, 0, - 16, 0x33EC, 0x0031, 0x0033, 0x65E5, 0, - 16, 0x33ED, 0x0031, 0x0034, 0x65E5, 0, - 16, 0x33EE, 0x0031, 0x0035, 0x65E5, 0, - 16, 0x33EF, 0x0031, 0x0036, 0x65E5, 0, - 16, 0x33F0, 0x0031, 0x0037, 0x65E5, 0, - 16, 0x33F1, 0x0031, 0x0038, 0x65E5, 0, - 16, 0x33F2, 0x0031, 0x0039, 0x65E5, 0, - 16, 0x33F3, 0x0032, 0x0030, 0x65E5, 0, - 16, 0x33F4, 0x0032, 0x0031, 0x65E5, 0, - 16, 0x33F5, 0x0032, 0x0032, 0x65E5, 0, - 16, 0x33F6, 0x0032, 0x0033, 0x65E5, 0, - 16, 0x33F7, 0x0032, 0x0034, 0x65E5, 0, - 16, 0x33F8, 0x0032, 0x0035, 0x65E5, 0, - 16, 0x33F9, 0x0032, 0x0036, 0x65E5, 0, - 16, 0x33FA, 0x0032, 0x0037, 0x65E5, 0, - 16, 0x33FB, 0x0032, 0x0038, 0x65E5, 0, - 16, 0x33FC, 0x0032, 0x0039, 0x65E5, 0, - 16, 0x33FD, 0x0033, 0x0030, 0x65E5, 0, - 16, 0x33FE, 0x0033, 0x0031, 0x65E5, 0, - 1, 0xF900, 0x8C48, 0, - 1, 0xF901, 0x66F4, 0, - 1, 0xF902, 0x8ECA, 0, - 1, 0xF903, 0x8CC8, 0, - 1, 0xF904, 0x6ED1, 0, - 1, 0xF905, 0x4E32, 0, - 1, 0xF906, 0x53E5, 0, - 1, 0xF907, 0x9F9C, 0, - 1, 0xF908, 0x9F9C, 0, - 1, 0xF909, 0x5951, 0, - 1, 0xF90A, 0x91D1, 0, - 1, 0xF90B, 0x5587, 0, - 1, 0xF90C, 0x5948, 0, - 1, 0xF90D, 0x61F6, 0, - 1, 0xF90E, 0x7669, 0, - 1, 0xF90F, 0x7F85, 0, - 1, 0xF910, 0x863F, 0, - 1, 0xF911, 0x87BA, 0, - 1, 0xF912, 0x88F8, 0, - 1, 0xF913, 0x908F, 0, - 1, 0xF914, 0x6A02, 0, - 1, 0xF915, 0x6D1B, 0, - 1, 0xF916, 0x70D9, 0, - 1, 0xF917, 0x73DE, 0, - 1, 0xF918, 0x843D, 0, - 1, 0xF919, 0x916A, 0, - 1, 0xF91A, 0x99F1, 0, - 1, 0xF91B, 0x4E82, 0, - 1, 0xF91C, 0x5375, 0, - 1, 0xF91D, 0x6B04, 0, - 1, 0xF91E, 0x721B, 0, - 1, 0xF91F, 0x862D, 0, - 1, 0xF920, 0x9E1E, 0, - 1, 0xF921, 0x5D50, 0, - 1, 0xF922, 0x6FEB, 0, - 1, 0xF923, 0x85CD, 0, - 1, 0xF924, 0x8964, 0, - 1, 0xF925, 0x62C9, 0, - 1, 0xF926, 0x81D8, 0, - 1, 0xF927, 0x881F, 0, - 1, 0xF928, 0x5ECA, 0, - 1, 0xF929, 0x6717, 0, - 1, 0xF92A, 0x6D6A, 0, - 1, 0xF92B, 0x72FC, 0, - 1, 0xF92C, 0x90CE, 0, - 1, 0xF92D, 0x4F86, 0, - 1, 0xF92E, 0x51B7, 0, - 1, 0xF92F, 0x52DE, 0, - 1, 0xF930, 0x64C4, 0, - 1, 0xF931, 0x6AD3, 0, - 1, 0xF932, 0x7210, 0, - 1, 0xF933, 0x76E7, 0, - 1, 0xF934, 0x8001, 0, - 1, 0xF935, 0x8606, 0, - 1, 0xF936, 0x865C, 0, - 1, 0xF937, 0x8DEF, 0, - 1, 0xF938, 0x9732, 0, - 1, 0xF939, 0x9B6F, 0, - 1, 0xF93A, 0x9DFA, 0, - 1, 0xF93B, 0x788C, 0, - 1, 0xF93C, 0x797F, 0, - 1, 0xF93D, 0x7DA0, 0, - 1, 0xF93E, 0x83C9, 0, - 1, 0xF93F, 0x9304, 0, - 1, 0xF940, 0x9E7F, 0, - 1, 0xF941, 0x8AD6, 0, - 1, 0xF942, 0x58DF, 0, - 1, 0xF943, 0x5F04, 0, - 1, 0xF944, 0x7C60, 0, - 1, 0xF945, 0x807E, 0, - 1, 0xF946, 0x7262, 0, - 1, 0xF947, 0x78CA, 0, - 1, 0xF948, 0x8CC2, 0, - 1, 0xF949, 0x96F7, 0, - 1, 0xF94A, 0x58D8, 0, - 1, 0xF94B, 0x5C62, 0, - 1, 0xF94C, 0x6A13, 0, - 1, 0xF94D, 0x6DDA, 0, - 1, 0xF94E, 0x6F0F, 0, - 1, 0xF94F, 0x7D2F, 0, - 1, 0xF950, 0x7E37, 0, - 1, 0xF951, 0x964B, 0, - 1, 0xF952, 0x52D2, 0, - 1, 0xF953, 0x808B, 0, - 1, 0xF954, 0x51DC, 0, - 1, 0xF955, 0x51CC, 0, - 1, 0xF956, 0x7A1C, 0, - 1, 0xF957, 0x7DBE, 0, - 1, 0xF958, 0x83F1, 0, - 1, 0xF959, 0x9675, 0, - 1, 0xF95A, 0x8B80, 0, - 1, 0xF95B, 0x62CF, 0, - 1, 0xF95C, 0x6A02, 0, - 1, 0xF95D, 0x8AFE, 0, - 1, 0xF95E, 0x4E39, 0, - 1, 0xF95F, 0x5BE7, 0, - 1, 0xF960, 0x6012, 0, - 1, 0xF961, 0x7387, 0, - 1, 0xF962, 0x7570, 0, - 1, 0xF963, 0x5317, 0, - 1, 0xF964, 0x78FB, 0, - 1, 0xF965, 0x4FBF, 0, - 1, 0xF966, 0x5FA9, 0, - 1, 0xF967, 0x4E0D, 0, - 1, 0xF968, 0x6CCC, 0, - 1, 0xF969, 0x6578, 0, - 1, 0xF96A, 0x7D22, 0, - 1, 0xF96B, 0x53C3, 0, - 1, 0xF96C, 0x585E, 0, - 1, 0xF96D, 0x7701, 0, - 1, 0xF96E, 0x8449, 0, - 1, 0xF96F, 0x8AAA, 0, - 1, 0xF970, 0x6BBA, 0, - 1, 0xF971, 0x8FB0, 0, - 1, 0xF972, 0x6C88, 0, - 1, 0xF973, 0x62FE, 0, - 1, 0xF974, 0x82E5, 0, - 1, 0xF975, 0x63A0, 0, - 1, 0xF976, 0x7565, 0, - 1, 0xF977, 0x4EAE, 0, - 1, 0xF978, 0x5169, 0, - 1, 0xF979, 0x51C9, 0, - 1, 0xF97A, 0x6881, 0, - 1, 0xF97B, 0x7CE7, 0, - 1, 0xF97C, 0x826F, 0, - 1, 0xF97D, 0x8AD2, 0, - 1, 0xF97E, 0x91CF, 0, - 1, 0xF97F, 0x52F5, 0, - 1, 0xF980, 0x5442, 0, - 1, 0xF981, 0x5973, 0, - 1, 0xF982, 0x5EEC, 0, - 1, 0xF983, 0x65C5, 0, - 1, 0xF984, 0x6FFE, 0, - 1, 0xF985, 0x792A, 0, - 1, 0xF986, 0x95AD, 0, - 1, 0xF987, 0x9A6A, 0, - 1, 0xF988, 0x9E97, 0, - 1, 0xF989, 0x9ECE, 0, - 1, 0xF98A, 0x529B, 0, - 1, 0xF98B, 0x66C6, 0, - 1, 0xF98C, 0x6B77, 0, - 1, 0xF98D, 0x8F62, 0, - 1, 0xF98E, 0x5E74, 0, - 1, 0xF98F, 0x6190, 0, - 1, 0xF990, 0x6200, 0, - 1, 0xF991, 0x649A, 0, - 1, 0xF992, 0x6F23, 0, - 1, 0xF993, 0x7149, 0, - 1, 0xF994, 0x7489, 0, - 1, 0xF995, 0x79CA, 0, - 1, 0xF996, 0x7DF4, 0, - 1, 0xF997, 0x806F, 0, - 1, 0xF998, 0x8F26, 0, - 1, 0xF999, 0x84EE, 0, - 1, 0xF99A, 0x9023, 0, - 1, 0xF99B, 0x934A, 0, - 1, 0xF99C, 0x5217, 0, - 1, 0xF99D, 0x52A3, 0, - 1, 0xF99E, 0x54BD, 0, - 1, 0xF99F, 0x70C8, 0, - 1, 0xF9A0, 0x88C2, 0, - 1, 0xF9A1, 0x8AAA, 0, - 1, 0xF9A2, 0x5EC9, 0, - 1, 0xF9A3, 0x5FF5, 0, - 1, 0xF9A4, 0x637B, 0, - 1, 0xF9A5, 0x6BAE, 0, - 1, 0xF9A6, 0x7C3E, 0, - 1, 0xF9A7, 0x7375, 0, - 1, 0xF9A8, 0x4EE4, 0, - 1, 0xF9A9, 0x56F9, 0, - 1, 0xF9AA, 0x5BE7, 0, - 1, 0xF9AB, 0x5DBA, 0, - 1, 0xF9AC, 0x601C, 0, - 1, 0xF9AD, 0x73B2, 0, - 1, 0xF9AE, 0x7469, 0, - 1, 0xF9AF, 0x7F9A, 0, - 1, 0xF9B0, 0x8046, 0, - 1, 0xF9B1, 0x9234, 0, - 1, 0xF9B2, 0x96F6, 0, - 1, 0xF9B3, 0x9748, 0, - 1, 0xF9B4, 0x9818, 0, - 1, 0xF9B5, 0x4F8B, 0, - 1, 0xF9B6, 0x79AE, 0, - 1, 0xF9B7, 0x91B4, 0, - 1, 0xF9B8, 0x96B8, 0, - 1, 0xF9B9, 0x60E1, 0, - 1, 0xF9BA, 0x4E86, 0, - 1, 0xF9BB, 0x50DA, 0, - 1, 0xF9BC, 0x5BEE, 0, - 1, 0xF9BD, 0x5C3F, 0, - 1, 0xF9BE, 0x6599, 0, - 1, 0xF9BF, 0x6A02, 0, - 1, 0xF9C0, 0x71CE, 0, - 1, 0xF9C1, 0x7642, 0, - 1, 0xF9C2, 0x84FC, 0, - 1, 0xF9C3, 0x907C, 0, - 1, 0xF9C4, 0x9F8D, 0, - 1, 0xF9C5, 0x6688, 0, - 1, 0xF9C6, 0x962E, 0, - 1, 0xF9C7, 0x5289, 0, - 1, 0xF9C8, 0x677B, 0, - 1, 0xF9C9, 0x67F3, 0, - 1, 0xF9CA, 0x6D41, 0, - 1, 0xF9CB, 0x6E9C, 0, - 1, 0xF9CC, 0x7409, 0, - 1, 0xF9CD, 0x7559, 0, - 1, 0xF9CE, 0x786B, 0, - 1, 0xF9CF, 0x7D10, 0, - 1, 0xF9D0, 0x985E, 0, - 1, 0xF9D1, 0x516D, 0, - 1, 0xF9D2, 0x622E, 0, - 1, 0xF9D3, 0x9678, 0, - 1, 0xF9D4, 0x502B, 0, - 1, 0xF9D5, 0x5D19, 0, - 1, 0xF9D6, 0x6DEA, 0, - 1, 0xF9D7, 0x8F2A, 0, - 1, 0xF9D8, 0x5F8B, 0, - 1, 0xF9D9, 0x6144, 0, - 1, 0xF9DA, 0x6817, 0, - 1, 0xF9DB, 0x7387, 0, - 1, 0xF9DC, 0x9686, 0, - 1, 0xF9DD, 0x5229, 0, - 1, 0xF9DE, 0x540F, 0, - 1, 0xF9DF, 0x5C65, 0, - 1, 0xF9E0, 0x6613, 0, - 1, 0xF9E1, 0x674E, 0, - 1, 0xF9E2, 0x68A8, 0, - 1, 0xF9E3, 0x6CE5, 0, - 1, 0xF9E4, 0x7406, 0, - 1, 0xF9E5, 0x75E2, 0, - 1, 0xF9E6, 0x7F79, 0, - 1, 0xF9E7, 0x88CF, 0, - 1, 0xF9E8, 0x88E1, 0, - 1, 0xF9E9, 0x91CC, 0, - 1, 0xF9EA, 0x96E2, 0, - 1, 0xF9EB, 0x533F, 0, - 1, 0xF9EC, 0x6EBA, 0, - 1, 0xF9ED, 0x541D, 0, - 1, 0xF9EE, 0x71D0, 0, - 1, 0xF9EF, 0x7498, 0, - 1, 0xF9F0, 0x85FA, 0, - 1, 0xF9F1, 0x96A3, 0, - 1, 0xF9F2, 0x9C57, 0, - 1, 0xF9F3, 0x9E9F, 0, - 1, 0xF9F4, 0x6797, 0, - 1, 0xF9F5, 0x6DCB, 0, - 1, 0xF9F6, 0x81E8, 0, - 1, 0xF9F7, 0x7ACB, 0, - 1, 0xF9F8, 0x7B20, 0, - 1, 0xF9F9, 0x7C92, 0, - 1, 0xF9FA, 0x72C0, 0, - 1, 0xF9FB, 0x7099, 0, - 1, 0xF9FC, 0x8B58, 0, - 1, 0xF9FD, 0x4EC0, 0, - 1, 0xF9FE, 0x8336, 0, - 1, 0xF9FF, 0x523A, 0, - 1, 0xFA00, 0x5207, 0, - 1, 0xFA01, 0x5EA6, 0, - 1, 0xFA02, 0x62D3, 0, - 1, 0xFA03, 0x7CD6, 0, - 1, 0xFA04, 0x5B85, 0, - 1, 0xFA05, 0x6D1E, 0, - 1, 0xFA06, 0x66B4, 0, - 1, 0xFA07, 0x8F3B, 0, - 1, 0xFA08, 0x884C, 0, - 1, 0xFA09, 0x964D, 0, - 1, 0xFA0A, 0x898B, 0, - 1, 0xFA0B, 0x5ED3, 0, - 1, 0xFA0C, 0x5140, 0, - 1, 0xFA0D, 0x55C0, 0, - 1, 0xFA10, 0x585A, 0, - 1, 0xFA12, 0x6674, 0, - 1, 0xFA15, 0x51DE, 0, - 1, 0xFA16, 0x732A, 0, - 1, 0xFA17, 0x76CA, 0, - 1, 0xFA18, 0x793C, 0, - 1, 0xFA19, 0x795E, 0, - 1, 0xFA1A, 0x7965, 0, - 1, 0xFA1B, 0x798F, 0, - 1, 0xFA1C, 0x9756, 0, - 1, 0xFA1D, 0x7CBE, 0, - 1, 0xFA1E, 0x7FBD, 0, - 1, 0xFA20, 0x8612, 0, - 1, 0xFA22, 0x8AF8, 0, - 1, 0xFA25, 0x9038, 0, - 1, 0xFA26, 0x90FD, 0, - 1, 0xFA2A, 0x98EF, 0, - 1, 0xFA2B, 0x98FC, 0, - 1, 0xFA2C, 0x9928, 0, - 1, 0xFA2D, 0x9DB4, 0, - 1, 0xFA30, 0x4FAE, 0, - 1, 0xFA31, 0x50E7, 0, - 1, 0xFA32, 0x514D, 0, - 1, 0xFA33, 0x52C9, 0, - 1, 0xFA34, 0x52E4, 0, - 1, 0xFA35, 0x5351, 0, - 1, 0xFA36, 0x559D, 0, - 1, 0xFA37, 0x5606, 0, - 1, 0xFA38, 0x5668, 0, - 1, 0xFA39, 0x5840, 0, - 1, 0xFA3A, 0x58A8, 0, - 1, 0xFA3B, 0x5C64, 0, - 1, 0xFA3C, 0x5C6E, 0, - 1, 0xFA3D, 0x6094, 0, - 1, 0xFA3E, 0x6168, 0, - 1, 0xFA3F, 0x618E, 0, - 1, 0xFA40, 0x61F2, 0, - 1, 0xFA41, 0x654F, 0, - 1, 0xFA42, 0x65E2, 0, - 1, 0xFA43, 0x6691, 0, - 1, 0xFA44, 0x6885, 0, - 1, 0xFA45, 0x6D77, 0, - 1, 0xFA46, 0x6E1A, 0, - 1, 0xFA47, 0x6F22, 0, - 1, 0xFA48, 0x716E, 0, - 1, 0xFA49, 0x722B, 0, - 1, 0xFA4A, 0x7422, 0, - 1, 0xFA4B, 0x7891, 0, - 1, 0xFA4C, 0x793E, 0, - 1, 0xFA4D, 0x7949, 0, - 1, 0xFA4E, 0x7948, 0, - 1, 0xFA4F, 0x7950, 0, - 1, 0xFA50, 0x7956, 0, - 1, 0xFA51, 0x795D, 0, - 1, 0xFA52, 0x798D, 0, - 1, 0xFA53, 0x798E, 0, - 1, 0xFA54, 0x7A40, 0, - 1, 0xFA55, 0x7A81, 0, - 1, 0xFA56, 0x7BC0, 0, - 1, 0xFA57, 0x7DF4, 0, - 1, 0xFA58, 0x7E09, 0, - 1, 0xFA59, 0x7E41, 0, - 1, 0xFA5A, 0x7F72, 0, - 1, 0xFA5B, 0x8005, 0, - 1, 0xFA5C, 0x81ED, 0, - 1, 0xFA5D, 0x8279, 0, - 1, 0xFA5E, 0x8279, 0, - 1, 0xFA5F, 0x8457, 0, - 1, 0xFA60, 0x8910, 0, - 1, 0xFA61, 0x8996, 0, - 1, 0xFA62, 0x8B01, 0, - 1, 0xFA63, 0x8B39, 0, - 1, 0xFA64, 0x8CD3, 0, - 1, 0xFA65, 0x8D08, 0, - 1, 0xFA66, 0x8FB6, 0, - 1, 0xFA67, 0x9038, 0, - 1, 0xFA68, 0x96E3, 0, - 1, 0xFA69, 0x97FF, 0, - 1, 0xFA6A, 0x983B, 0, - 16, 0xFB00, 0x0066, 0x0066, 0, - 16, 0xFB01, 0x0066, 0x0069, 0, - 16, 0xFB02, 0x0066, 0x006C, 0, - 16, 0xFB03, 0x0066, 0x0066, 0x0069, 0, - 16, 0xFB04, 0x0066, 0x0066, 0x006C, 0, - 16, 0xFB05, 0x017F, 0x0074, 0, - 16, 0xFB06, 0x0073, 0x0074, 0, - 16, 0xFB13, 0x0574, 0x0576, 0, - 16, 0xFB14, 0x0574, 0x0565, 0, - 16, 0xFB15, 0x0574, 0x056B, 0, - 16, 0xFB16, 0x057E, 0x0576, 0, - 16, 0xFB17, 0x0574, 0x056D, 0, - 1, 0xFB1D, 0x05D9, 0x05B4, 0, - 1, 0xFB1F, 0x05F2, 0x05B7, 0, - 2, 0xFB20, 0x05E2, 0, - 2, 0xFB21, 0x05D0, 0, - 2, 0xFB22, 0x05D3, 0, - 2, 0xFB23, 0x05D4, 0, - 2, 0xFB24, 0x05DB, 0, - 2, 0xFB25, 0x05DC, 0, - 2, 0xFB26, 0x05DD, 0, - 2, 0xFB27, 0x05E8, 0, - 2, 0xFB28, 0x05EA, 0, - 2, 0xFB29, 0x002B, 0, - 1, 0xFB2A, 0x05E9, 0x05C1, 0, - 1, 0xFB2B, 0x05E9, 0x05C2, 0, - 1, 0xFB2C, 0xFB49, 0x05C1, 0, - 1, 0xFB2D, 0xFB49, 0x05C2, 0, - 1, 0xFB2E, 0x05D0, 0x05B7, 0, - 1, 0xFB2F, 0x05D0, 0x05B8, 0, - 1, 0xFB30, 0x05D0, 0x05BC, 0, - 1, 0xFB31, 0x05D1, 0x05BC, 0, - 1, 0xFB32, 0x05D2, 0x05BC, 0, - 1, 0xFB33, 0x05D3, 0x05BC, 0, - 1, 0xFB34, 0x05D4, 0x05BC, 0, - 1, 0xFB35, 0x05D5, 0x05BC, 0, - 1, 0xFB36, 0x05D6, 0x05BC, 0, - 1, 0xFB38, 0x05D8, 0x05BC, 0, - 1, 0xFB39, 0x05D9, 0x05BC, 0, - 1, 0xFB3A, 0x05DA, 0x05BC, 0, - 1, 0xFB3B, 0x05DB, 0x05BC, 0, - 1, 0xFB3C, 0x05DC, 0x05BC, 0, - 1, 0xFB3E, 0x05DE, 0x05BC, 0, - 1, 0xFB40, 0x05E0, 0x05BC, 0, - 1, 0xFB41, 0x05E1, 0x05BC, 0, - 1, 0xFB43, 0x05E3, 0x05BC, 0, - 1, 0xFB44, 0x05E4, 0x05BC, 0, - 1, 0xFB46, 0x05E6, 0x05BC, 0, - 1, 0xFB47, 0x05E7, 0x05BC, 0, - 1, 0xFB48, 0x05E8, 0x05BC, 0, - 1, 0xFB49, 0x05E9, 0x05BC, 0, - 1, 0xFB4A, 0x05EA, 0x05BC, 0, - 1, 0xFB4B, 0x05D5, 0x05B9, 0, - 1, 0xFB4C, 0x05D1, 0x05BF, 0, - 1, 0xFB4D, 0x05DB, 0x05BF, 0, - 1, 0xFB4E, 0x05E4, 0x05BF, 0, - 16, 0xFB4F, 0x05D0, 0x05DC, 0, - 7, 0xFB50, 0x0671, 0, - 6, 0xFB51, 0x0671, 0, - 7, 0xFB52, 0x067B, 0, - 6, 0xFB53, 0x067B, 0, - 4, 0xFB54, 0x067B, 0, - 5, 0xFB55, 0x067B, 0, - 7, 0xFB56, 0x067E, 0, - 6, 0xFB57, 0x067E, 0, - 4, 0xFB58, 0x067E, 0, - 5, 0xFB59, 0x067E, 0, - 7, 0xFB5A, 0x0680, 0, - 6, 0xFB5B, 0x0680, 0, - 4, 0xFB5C, 0x0680, 0, - 5, 0xFB5D, 0x0680, 0, - 7, 0xFB5E, 0x067A, 0, - 6, 0xFB5F, 0x067A, 0, - 4, 0xFB60, 0x067A, 0, - 5, 0xFB61, 0x067A, 0, - 7, 0xFB62, 0x067F, 0, - 6, 0xFB63, 0x067F, 0, - 4, 0xFB64, 0x067F, 0, - 5, 0xFB65, 0x067F, 0, - 7, 0xFB66, 0x0679, 0, - 6, 0xFB67, 0x0679, 0, - 4, 0xFB68, 0x0679, 0, - 5, 0xFB69, 0x0679, 0, - 7, 0xFB6A, 0x06A4, 0, - 6, 0xFB6B, 0x06A4, 0, - 4, 0xFB6C, 0x06A4, 0, - 5, 0xFB6D, 0x06A4, 0, - 7, 0xFB6E, 0x06A6, 0, - 6, 0xFB6F, 0x06A6, 0, - 4, 0xFB70, 0x06A6, 0, - 5, 0xFB71, 0x06A6, 0, - 7, 0xFB72, 0x0684, 0, - 6, 0xFB73, 0x0684, 0, - 4, 0xFB74, 0x0684, 0, - 5, 0xFB75, 0x0684, 0, - 7, 0xFB76, 0x0683, 0, - 6, 0xFB77, 0x0683, 0, - 4, 0xFB78, 0x0683, 0, - 5, 0xFB79, 0x0683, 0, - 7, 0xFB7A, 0x0686, 0, - 6, 0xFB7B, 0x0686, 0, - 4, 0xFB7C, 0x0686, 0, - 5, 0xFB7D, 0x0686, 0, - 7, 0xFB7E, 0x0687, 0, - 6, 0xFB7F, 0x0687, 0, - 4, 0xFB80, 0x0687, 0, - 5, 0xFB81, 0x0687, 0, - 7, 0xFB82, 0x068D, 0, - 6, 0xFB83, 0x068D, 0, - 7, 0xFB84, 0x068C, 0, - 6, 0xFB85, 0x068C, 0, - 7, 0xFB86, 0x068E, 0, - 6, 0xFB87, 0x068E, 0, - 7, 0xFB88, 0x0688, 0, - 6, 0xFB89, 0x0688, 0, - 7, 0xFB8A, 0x0698, 0, - 6, 0xFB8B, 0x0698, 0, - 7, 0xFB8C, 0x0691, 0, - 6, 0xFB8D, 0x0691, 0, - 7, 0xFB8E, 0x06A9, 0, - 6, 0xFB8F, 0x06A9, 0, - 4, 0xFB90, 0x06A9, 0, - 5, 0xFB91, 0x06A9, 0, - 7, 0xFB92, 0x06AF, 0, - 6, 0xFB93, 0x06AF, 0, - 4, 0xFB94, 0x06AF, 0, - 5, 0xFB95, 0x06AF, 0, - 7, 0xFB96, 0x06B3, 0, - 6, 0xFB97, 0x06B3, 0, - 4, 0xFB98, 0x06B3, 0, - 5, 0xFB99, 0x06B3, 0, - 7, 0xFB9A, 0x06B1, 0, - 6, 0xFB9B, 0x06B1, 0, - 4, 0xFB9C, 0x06B1, 0, - 5, 0xFB9D, 0x06B1, 0, - 7, 0xFB9E, 0x06BA, 0, - 6, 0xFB9F, 0x06BA, 0, - 7, 0xFBA0, 0x06BB, 0, - 6, 0xFBA1, 0x06BB, 0, - 4, 0xFBA2, 0x06BB, 0, - 5, 0xFBA3, 0x06BB, 0, - 7, 0xFBA4, 0x06C0, 0, - 6, 0xFBA5, 0x06C0, 0, - 7, 0xFBA6, 0x06C1, 0, - 6, 0xFBA7, 0x06C1, 0, - 4, 0xFBA8, 0x06C1, 0, - 5, 0xFBA9, 0x06C1, 0, - 7, 0xFBAA, 0x06BE, 0, - 6, 0xFBAB, 0x06BE, 0, - 4, 0xFBAC, 0x06BE, 0, - 5, 0xFBAD, 0x06BE, 0, - 7, 0xFBAE, 0x06D2, 0, - 6, 0xFBAF, 0x06D2, 0, - 7, 0xFBB0, 0x06D3, 0, - 6, 0xFBB1, 0x06D3, 0, - 7, 0xFBD3, 0x06AD, 0, - 6, 0xFBD4, 0x06AD, 0, - 4, 0xFBD5, 0x06AD, 0, - 5, 0xFBD6, 0x06AD, 0, - 7, 0xFBD7, 0x06C7, 0, - 6, 0xFBD8, 0x06C7, 0, - 7, 0xFBD9, 0x06C6, 0, - 6, 0xFBDA, 0x06C6, 0, - 7, 0xFBDB, 0x06C8, 0, - 6, 0xFBDC, 0x06C8, 0, - 7, 0xFBDD, 0x0677, 0, - 7, 0xFBDE, 0x06CB, 0, - 6, 0xFBDF, 0x06CB, 0, - 7, 0xFBE0, 0x06C5, 0, - 6, 0xFBE1, 0x06C5, 0, - 7, 0xFBE2, 0x06C9, 0, - 6, 0xFBE3, 0x06C9, 0, - 7, 0xFBE4, 0x06D0, 0, - 6, 0xFBE5, 0x06D0, 0, - 4, 0xFBE6, 0x06D0, 0, - 5, 0xFBE7, 0x06D0, 0, - 4, 0xFBE8, 0x0649, 0, - 5, 0xFBE9, 0x0649, 0, - 7, 0xFBEA, 0x0626, 0x0627, 0, - 6, 0xFBEB, 0x0626, 0x0627, 0, - 7, 0xFBEC, 0x0626, 0x06D5, 0, - 6, 0xFBED, 0x0626, 0x06D5, 0, - 7, 0xFBEE, 0x0626, 0x0648, 0, - 6, 0xFBEF, 0x0626, 0x0648, 0, - 7, 0xFBF0, 0x0626, 0x06C7, 0, - 6, 0xFBF1, 0x0626, 0x06C7, 0, - 7, 0xFBF2, 0x0626, 0x06C6, 0, - 6, 0xFBF3, 0x0626, 0x06C6, 0, - 7, 0xFBF4, 0x0626, 0x06C8, 0, - 6, 0xFBF5, 0x0626, 0x06C8, 0, - 7, 0xFBF6, 0x0626, 0x06D0, 0, - 6, 0xFBF7, 0x0626, 0x06D0, 0, - 4, 0xFBF8, 0x0626, 0x06D0, 0, - 7, 0xFBF9, 0x0626, 0x0649, 0, - 6, 0xFBFA, 0x0626, 0x0649, 0, - 4, 0xFBFB, 0x0626, 0x0649, 0, - 7, 0xFBFC, 0x06CC, 0, - 6, 0xFBFD, 0x06CC, 0, - 4, 0xFBFE, 0x06CC, 0, - 5, 0xFBFF, 0x06CC, 0, - 7, 0xFC00, 0x0626, 0x062C, 0, - 7, 0xFC01, 0x0626, 0x062D, 0, - 7, 0xFC02, 0x0626, 0x0645, 0, - 7, 0xFC03, 0x0626, 0x0649, 0, - 7, 0xFC04, 0x0626, 0x064A, 0, - 7, 0xFC05, 0x0628, 0x062C, 0, - 7, 0xFC06, 0x0628, 0x062D, 0, - 7, 0xFC07, 0x0628, 0x062E, 0, - 7, 0xFC08, 0x0628, 0x0645, 0, - 7, 0xFC09, 0x0628, 0x0649, 0, - 7, 0xFC0A, 0x0628, 0x064A, 0, - 7, 0xFC0B, 0x062A, 0x062C, 0, - 7, 0xFC0C, 0x062A, 0x062D, 0, - 7, 0xFC0D, 0x062A, 0x062E, 0, - 7, 0xFC0E, 0x062A, 0x0645, 0, - 7, 0xFC0F, 0x062A, 0x0649, 0, - 7, 0xFC10, 0x062A, 0x064A, 0, - 7, 0xFC11, 0x062B, 0x062C, 0, - 7, 0xFC12, 0x062B, 0x0645, 0, - 7, 0xFC13, 0x062B, 0x0649, 0, - 7, 0xFC14, 0x062B, 0x064A, 0, - 7, 0xFC15, 0x062C, 0x062D, 0, - 7, 0xFC16, 0x062C, 0x0645, 0, - 7, 0xFC17, 0x062D, 0x062C, 0, - 7, 0xFC18, 0x062D, 0x0645, 0, - 7, 0xFC19, 0x062E, 0x062C, 0, - 7, 0xFC1A, 0x062E, 0x062D, 0, - 7, 0xFC1B, 0x062E, 0x0645, 0, - 7, 0xFC1C, 0x0633, 0x062C, 0, - 7, 0xFC1D, 0x0633, 0x062D, 0, - 7, 0xFC1E, 0x0633, 0x062E, 0, - 7, 0xFC1F, 0x0633, 0x0645, 0, - 7, 0xFC20, 0x0635, 0x062D, 0, - 7, 0xFC21, 0x0635, 0x0645, 0, - 7, 0xFC22, 0x0636, 0x062C, 0, - 7, 0xFC23, 0x0636, 0x062D, 0, - 7, 0xFC24, 0x0636, 0x062E, 0, - 7, 0xFC25, 0x0636, 0x0645, 0, - 7, 0xFC26, 0x0637, 0x062D, 0, - 7, 0xFC27, 0x0637, 0x0645, 0, - 7, 0xFC28, 0x0638, 0x0645, 0, - 7, 0xFC29, 0x0639, 0x062C, 0, - 7, 0xFC2A, 0x0639, 0x0645, 0, - 7, 0xFC2B, 0x063A, 0x062C, 0, - 7, 0xFC2C, 0x063A, 0x0645, 0, - 7, 0xFC2D, 0x0641, 0x062C, 0, - 7, 0xFC2E, 0x0641, 0x062D, 0, - 7, 0xFC2F, 0x0641, 0x062E, 0, - 7, 0xFC30, 0x0641, 0x0645, 0, - 7, 0xFC31, 0x0641, 0x0649, 0, - 7, 0xFC32, 0x0641, 0x064A, 0, - 7, 0xFC33, 0x0642, 0x062D, 0, - 7, 0xFC34, 0x0642, 0x0645, 0, - 7, 0xFC35, 0x0642, 0x0649, 0, - 7, 0xFC36, 0x0642, 0x064A, 0, - 7, 0xFC37, 0x0643, 0x0627, 0, - 7, 0xFC38, 0x0643, 0x062C, 0, - 7, 0xFC39, 0x0643, 0x062D, 0, - 7, 0xFC3A, 0x0643, 0x062E, 0, - 7, 0xFC3B, 0x0643, 0x0644, 0, - 7, 0xFC3C, 0x0643, 0x0645, 0, - 7, 0xFC3D, 0x0643, 0x0649, 0, - 7, 0xFC3E, 0x0643, 0x064A, 0, - 7, 0xFC3F, 0x0644, 0x062C, 0, - 7, 0xFC40, 0x0644, 0x062D, 0, - 7, 0xFC41, 0x0644, 0x062E, 0, - 7, 0xFC42, 0x0644, 0x0645, 0, - 7, 0xFC43, 0x0644, 0x0649, 0, - 7, 0xFC44, 0x0644, 0x064A, 0, - 7, 0xFC45, 0x0645, 0x062C, 0, - 7, 0xFC46, 0x0645, 0x062D, 0, - 7, 0xFC47, 0x0645, 0x062E, 0, - 7, 0xFC48, 0x0645, 0x0645, 0, - 7, 0xFC49, 0x0645, 0x0649, 0, - 7, 0xFC4A, 0x0645, 0x064A, 0, - 7, 0xFC4B, 0x0646, 0x062C, 0, - 7, 0xFC4C, 0x0646, 0x062D, 0, - 7, 0xFC4D, 0x0646, 0x062E, 0, - 7, 0xFC4E, 0x0646, 0x0645, 0, - 7, 0xFC4F, 0x0646, 0x0649, 0, - 7, 0xFC50, 0x0646, 0x064A, 0, - 7, 0xFC51, 0x0647, 0x062C, 0, - 7, 0xFC52, 0x0647, 0x0645, 0, - 7, 0xFC53, 0x0647, 0x0649, 0, - 7, 0xFC54, 0x0647, 0x064A, 0, - 7, 0xFC55, 0x064A, 0x062C, 0, - 7, 0xFC56, 0x064A, 0x062D, 0, - 7, 0xFC57, 0x064A, 0x062E, 0, - 7, 0xFC58, 0x064A, 0x0645, 0, - 7, 0xFC59, 0x064A, 0x0649, 0, - 7, 0xFC5A, 0x064A, 0x064A, 0, - 7, 0xFC5B, 0x0630, 0x0670, 0, - 7, 0xFC5C, 0x0631, 0x0670, 0, - 7, 0xFC5D, 0x0649, 0x0670, 0, - 7, 0xFC5E, 0x0020, 0x064C, 0x0651, 0, - 7, 0xFC5F, 0x0020, 0x064D, 0x0651, 0, - 7, 0xFC60, 0x0020, 0x064E, 0x0651, 0, - 7, 0xFC61, 0x0020, 0x064F, 0x0651, 0, - 7, 0xFC62, 0x0020, 0x0650, 0x0651, 0, - 7, 0xFC63, 0x0020, 0x0651, 0x0670, 0, - 6, 0xFC64, 0x0626, 0x0631, 0, - 6, 0xFC65, 0x0626, 0x0632, 0, - 6, 0xFC66, 0x0626, 0x0645, 0, - 6, 0xFC67, 0x0626, 0x0646, 0, - 6, 0xFC68, 0x0626, 0x0649, 0, - 6, 0xFC69, 0x0626, 0x064A, 0, - 6, 0xFC6A, 0x0628, 0x0631, 0, - 6, 0xFC6B, 0x0628, 0x0632, 0, - 6, 0xFC6C, 0x0628, 0x0645, 0, - 6, 0xFC6D, 0x0628, 0x0646, 0, - 6, 0xFC6E, 0x0628, 0x0649, 0, - 6, 0xFC6F, 0x0628, 0x064A, 0, - 6, 0xFC70, 0x062A, 0x0631, 0, - 6, 0xFC71, 0x062A, 0x0632, 0, - 6, 0xFC72, 0x062A, 0x0645, 0, - 6, 0xFC73, 0x062A, 0x0646, 0, - 6, 0xFC74, 0x062A, 0x0649, 0, - 6, 0xFC75, 0x062A, 0x064A, 0, - 6, 0xFC76, 0x062B, 0x0631, 0, - 6, 0xFC77, 0x062B, 0x0632, 0, - 6, 0xFC78, 0x062B, 0x0645, 0, - 6, 0xFC79, 0x062B, 0x0646, 0, - 6, 0xFC7A, 0x062B, 0x0649, 0, - 6, 0xFC7B, 0x062B, 0x064A, 0, - 6, 0xFC7C, 0x0641, 0x0649, 0, - 6, 0xFC7D, 0x0641, 0x064A, 0, - 6, 0xFC7E, 0x0642, 0x0649, 0, - 6, 0xFC7F, 0x0642, 0x064A, 0, - 6, 0xFC80, 0x0643, 0x0627, 0, - 6, 0xFC81, 0x0643, 0x0644, 0, - 6, 0xFC82, 0x0643, 0x0645, 0, - 6, 0xFC83, 0x0643, 0x0649, 0, - 6, 0xFC84, 0x0643, 0x064A, 0, - 6, 0xFC85, 0x0644, 0x0645, 0, - 6, 0xFC86, 0x0644, 0x0649, 0, - 6, 0xFC87, 0x0644, 0x064A, 0, - 6, 0xFC88, 0x0645, 0x0627, 0, - 6, 0xFC89, 0x0645, 0x0645, 0, - 6, 0xFC8A, 0x0646, 0x0631, 0, - 6, 0xFC8B, 0x0646, 0x0632, 0, - 6, 0xFC8C, 0x0646, 0x0645, 0, - 6, 0xFC8D, 0x0646, 0x0646, 0, - 6, 0xFC8E, 0x0646, 0x0649, 0, - 6, 0xFC8F, 0x0646, 0x064A, 0, - 6, 0xFC90, 0x0649, 0x0670, 0, - 6, 0xFC91, 0x064A, 0x0631, 0, - 6, 0xFC92, 0x064A, 0x0632, 0, - 6, 0xFC93, 0x064A, 0x0645, 0, - 6, 0xFC94, 0x064A, 0x0646, 0, - 6, 0xFC95, 0x064A, 0x0649, 0, - 6, 0xFC96, 0x064A, 0x064A, 0, - 4, 0xFC97, 0x0626, 0x062C, 0, - 4, 0xFC98, 0x0626, 0x062D, 0, - 4, 0xFC99, 0x0626, 0x062E, 0, - 4, 0xFC9A, 0x0626, 0x0645, 0, - 4, 0xFC9B, 0x0626, 0x0647, 0, - 4, 0xFC9C, 0x0628, 0x062C, 0, - 4, 0xFC9D, 0x0628, 0x062D, 0, - 4, 0xFC9E, 0x0628, 0x062E, 0, - 4, 0xFC9F, 0x0628, 0x0645, 0, - 4, 0xFCA0, 0x0628, 0x0647, 0, - 4, 0xFCA1, 0x062A, 0x062C, 0, - 4, 0xFCA2, 0x062A, 0x062D, 0, - 4, 0xFCA3, 0x062A, 0x062E, 0, - 4, 0xFCA4, 0x062A, 0x0645, 0, - 4, 0xFCA5, 0x062A, 0x0647, 0, - 4, 0xFCA6, 0x062B, 0x0645, 0, - 4, 0xFCA7, 0x062C, 0x062D, 0, - 4, 0xFCA8, 0x062C, 0x0645, 0, - 4, 0xFCA9, 0x062D, 0x062C, 0, - 4, 0xFCAA, 0x062D, 0x0645, 0, - 4, 0xFCAB, 0x062E, 0x062C, 0, - 4, 0xFCAC, 0x062E, 0x0645, 0, - 4, 0xFCAD, 0x0633, 0x062C, 0, - 4, 0xFCAE, 0x0633, 0x062D, 0, - 4, 0xFCAF, 0x0633, 0x062E, 0, - 4, 0xFCB0, 0x0633, 0x0645, 0, - 4, 0xFCB1, 0x0635, 0x062D, 0, - 4, 0xFCB2, 0x0635, 0x062E, 0, - 4, 0xFCB3, 0x0635, 0x0645, 0, - 4, 0xFCB4, 0x0636, 0x062C, 0, - 4, 0xFCB5, 0x0636, 0x062D, 0, - 4, 0xFCB6, 0x0636, 0x062E, 0, - 4, 0xFCB7, 0x0636, 0x0645, 0, - 4, 0xFCB8, 0x0637, 0x062D, 0, - 4, 0xFCB9, 0x0638, 0x0645, 0, - 4, 0xFCBA, 0x0639, 0x062C, 0, - 4, 0xFCBB, 0x0639, 0x0645, 0, - 4, 0xFCBC, 0x063A, 0x062C, 0, - 4, 0xFCBD, 0x063A, 0x0645, 0, - 4, 0xFCBE, 0x0641, 0x062C, 0, - 4, 0xFCBF, 0x0641, 0x062D, 0, - 4, 0xFCC0, 0x0641, 0x062E, 0, - 4, 0xFCC1, 0x0641, 0x0645, 0, - 4, 0xFCC2, 0x0642, 0x062D, 0, - 4, 0xFCC3, 0x0642, 0x0645, 0, - 4, 0xFCC4, 0x0643, 0x062C, 0, - 4, 0xFCC5, 0x0643, 0x062D, 0, - 4, 0xFCC6, 0x0643, 0x062E, 0, - 4, 0xFCC7, 0x0643, 0x0644, 0, - 4, 0xFCC8, 0x0643, 0x0645, 0, - 4, 0xFCC9, 0x0644, 0x062C, 0, - 4, 0xFCCA, 0x0644, 0x062D, 0, - 4, 0xFCCB, 0x0644, 0x062E, 0, - 4, 0xFCCC, 0x0644, 0x0645, 0, - 4, 0xFCCD, 0x0644, 0x0647, 0, - 4, 0xFCCE, 0x0645, 0x062C, 0, - 4, 0xFCCF, 0x0645, 0x062D, 0, - 4, 0xFCD0, 0x0645, 0x062E, 0, - 4, 0xFCD1, 0x0645, 0x0645, 0, - 4, 0xFCD2, 0x0646, 0x062C, 0, - 4, 0xFCD3, 0x0646, 0x062D, 0, - 4, 0xFCD4, 0x0646, 0x062E, 0, - 4, 0xFCD5, 0x0646, 0x0645, 0, - 4, 0xFCD6, 0x0646, 0x0647, 0, - 4, 0xFCD7, 0x0647, 0x062C, 0, - 4, 0xFCD8, 0x0647, 0x0645, 0, - 4, 0xFCD9, 0x0647, 0x0670, 0, - 4, 0xFCDA, 0x064A, 0x062C, 0, - 4, 0xFCDB, 0x064A, 0x062D, 0, - 4, 0xFCDC, 0x064A, 0x062E, 0, - 4, 0xFCDD, 0x064A, 0x0645, 0, - 4, 0xFCDE, 0x064A, 0x0647, 0, - 5, 0xFCDF, 0x0626, 0x0645, 0, - 5, 0xFCE0, 0x0626, 0x0647, 0, - 5, 0xFCE1, 0x0628, 0x0645, 0, - 5, 0xFCE2, 0x0628, 0x0647, 0, - 5, 0xFCE3, 0x062A, 0x0645, 0, - 5, 0xFCE4, 0x062A, 0x0647, 0, - 5, 0xFCE5, 0x062B, 0x0645, 0, - 5, 0xFCE6, 0x062B, 0x0647, 0, - 5, 0xFCE7, 0x0633, 0x0645, 0, - 5, 0xFCE8, 0x0633, 0x0647, 0, - 5, 0xFCE9, 0x0634, 0x0645, 0, - 5, 0xFCEA, 0x0634, 0x0647, 0, - 5, 0xFCEB, 0x0643, 0x0644, 0, - 5, 0xFCEC, 0x0643, 0x0645, 0, - 5, 0xFCED, 0x0644, 0x0645, 0, - 5, 0xFCEE, 0x0646, 0x0645, 0, - 5, 0xFCEF, 0x0646, 0x0647, 0, - 5, 0xFCF0, 0x064A, 0x0645, 0, - 5, 0xFCF1, 0x064A, 0x0647, 0, - 5, 0xFCF2, 0x0640, 0x064E, 0x0651, 0, - 5, 0xFCF3, 0x0640, 0x064F, 0x0651, 0, - 5, 0xFCF4, 0x0640, 0x0650, 0x0651, 0, - 7, 0xFCF5, 0x0637, 0x0649, 0, - 7, 0xFCF6, 0x0637, 0x064A, 0, - 7, 0xFCF7, 0x0639, 0x0649, 0, - 7, 0xFCF8, 0x0639, 0x064A, 0, - 7, 0xFCF9, 0x063A, 0x0649, 0, - 7, 0xFCFA, 0x063A, 0x064A, 0, - 7, 0xFCFB, 0x0633, 0x0649, 0, - 7, 0xFCFC, 0x0633, 0x064A, 0, - 7, 0xFCFD, 0x0634, 0x0649, 0, - 7, 0xFCFE, 0x0634, 0x064A, 0, - 7, 0xFCFF, 0x062D, 0x0649, 0, - 7, 0xFD00, 0x062D, 0x064A, 0, - 7, 0xFD01, 0x062C, 0x0649, 0, - 7, 0xFD02, 0x062C, 0x064A, 0, - 7, 0xFD03, 0x062E, 0x0649, 0, - 7, 0xFD04, 0x062E, 0x064A, 0, - 7, 0xFD05, 0x0635, 0x0649, 0, - 7, 0xFD06, 0x0635, 0x064A, 0, - 7, 0xFD07, 0x0636, 0x0649, 0, - 7, 0xFD08, 0x0636, 0x064A, 0, - 7, 0xFD09, 0x0634, 0x062C, 0, - 7, 0xFD0A, 0x0634, 0x062D, 0, - 7, 0xFD0B, 0x0634, 0x062E, 0, - 7, 0xFD0C, 0x0634, 0x0645, 0, - 7, 0xFD0D, 0x0634, 0x0631, 0, - 7, 0xFD0E, 0x0633, 0x0631, 0, - 7, 0xFD0F, 0x0635, 0x0631, 0, - 7, 0xFD10, 0x0636, 0x0631, 0, - 6, 0xFD11, 0x0637, 0x0649, 0, - 6, 0xFD12, 0x0637, 0x064A, 0, - 6, 0xFD13, 0x0639, 0x0649, 0, - 6, 0xFD14, 0x0639, 0x064A, 0, - 6, 0xFD15, 0x063A, 0x0649, 0, - 6, 0xFD16, 0x063A, 0x064A, 0, - 6, 0xFD17, 0x0633, 0x0649, 0, - 6, 0xFD18, 0x0633, 0x064A, 0, - 6, 0xFD19, 0x0634, 0x0649, 0, - 6, 0xFD1A, 0x0634, 0x064A, 0, - 6, 0xFD1B, 0x062D, 0x0649, 0, - 6, 0xFD1C, 0x062D, 0x064A, 0, - 6, 0xFD1D, 0x062C, 0x0649, 0, - 6, 0xFD1E, 0x062C, 0x064A, 0, - 6, 0xFD1F, 0x062E, 0x0649, 0, - 6, 0xFD20, 0x062E, 0x064A, 0, - 6, 0xFD21, 0x0635, 0x0649, 0, - 6, 0xFD22, 0x0635, 0x064A, 0, - 6, 0xFD23, 0x0636, 0x0649, 0, - 6, 0xFD24, 0x0636, 0x064A, 0, - 6, 0xFD25, 0x0634, 0x062C, 0, - 6, 0xFD26, 0x0634, 0x062D, 0, - 6, 0xFD27, 0x0634, 0x062E, 0, - 6, 0xFD28, 0x0634, 0x0645, 0, - 6, 0xFD29, 0x0634, 0x0631, 0, - 6, 0xFD2A, 0x0633, 0x0631, 0, - 6, 0xFD2B, 0x0635, 0x0631, 0, - 6, 0xFD2C, 0x0636, 0x0631, 0, - 4, 0xFD2D, 0x0634, 0x062C, 0, - 4, 0xFD2E, 0x0634, 0x062D, 0, - 4, 0xFD2F, 0x0634, 0x062E, 0, - 4, 0xFD30, 0x0634, 0x0645, 0, - 4, 0xFD31, 0x0633, 0x0647, 0, - 4, 0xFD32, 0x0634, 0x0647, 0, - 4, 0xFD33, 0x0637, 0x0645, 0, - 5, 0xFD34, 0x0633, 0x062C, 0, - 5, 0xFD35, 0x0633, 0x062D, 0, - 5, 0xFD36, 0x0633, 0x062E, 0, - 5, 0xFD37, 0x0634, 0x062C, 0, - 5, 0xFD38, 0x0634, 0x062D, 0, - 5, 0xFD39, 0x0634, 0x062E, 0, - 5, 0xFD3A, 0x0637, 0x0645, 0, - 5, 0xFD3B, 0x0638, 0x0645, 0, - 6, 0xFD3C, 0x0627, 0x064B, 0, - 7, 0xFD3D, 0x0627, 0x064B, 0, - 4, 0xFD50, 0x062A, 0x062C, 0x0645, 0, - 6, 0xFD51, 0x062A, 0x062D, 0x062C, 0, - 4, 0xFD52, 0x062A, 0x062D, 0x062C, 0, - 4, 0xFD53, 0x062A, 0x062D, 0x0645, 0, - 4, 0xFD54, 0x062A, 0x062E, 0x0645, 0, - 4, 0xFD55, 0x062A, 0x0645, 0x062C, 0, - 4, 0xFD56, 0x062A, 0x0645, 0x062D, 0, - 4, 0xFD57, 0x062A, 0x0645, 0x062E, 0, - 6, 0xFD58, 0x062C, 0x0645, 0x062D, 0, - 4, 0xFD59, 0x062C, 0x0645, 0x062D, 0, - 6, 0xFD5A, 0x062D, 0x0645, 0x064A, 0, - 6, 0xFD5B, 0x062D, 0x0645, 0x0649, 0, - 4, 0xFD5C, 0x0633, 0x062D, 0x062C, 0, - 4, 0xFD5D, 0x0633, 0x062C, 0x062D, 0, - 6, 0xFD5E, 0x0633, 0x062C, 0x0649, 0, - 6, 0xFD5F, 0x0633, 0x0645, 0x062D, 0, - 4, 0xFD60, 0x0633, 0x0645, 0x062D, 0, - 4, 0xFD61, 0x0633, 0x0645, 0x062C, 0, - 6, 0xFD62, 0x0633, 0x0645, 0x0645, 0, - 4, 0xFD63, 0x0633, 0x0645, 0x0645, 0, - 6, 0xFD64, 0x0635, 0x062D, 0x062D, 0, - 4, 0xFD65, 0x0635, 0x062D, 0x062D, 0, - 6, 0xFD66, 0x0635, 0x0645, 0x0645, 0, - 6, 0xFD67, 0x0634, 0x062D, 0x0645, 0, - 4, 0xFD68, 0x0634, 0x062D, 0x0645, 0, - 6, 0xFD69, 0x0634, 0x062C, 0x064A, 0, - 6, 0xFD6A, 0x0634, 0x0645, 0x062E, 0, - 4, 0xFD6B, 0x0634, 0x0645, 0x062E, 0, - 6, 0xFD6C, 0x0634, 0x0645, 0x0645, 0, - 4, 0xFD6D, 0x0634, 0x0645, 0x0645, 0, - 6, 0xFD6E, 0x0636, 0x062D, 0x0649, 0, - 6, 0xFD6F, 0x0636, 0x062E, 0x0645, 0, - 4, 0xFD70, 0x0636, 0x062E, 0x0645, 0, - 6, 0xFD71, 0x0637, 0x0645, 0x062D, 0, - 4, 0xFD72, 0x0637, 0x0645, 0x062D, 0, - 4, 0xFD73, 0x0637, 0x0645, 0x0645, 0, - 6, 0xFD74, 0x0637, 0x0645, 0x064A, 0, - 6, 0xFD75, 0x0639, 0x062C, 0x0645, 0, - 6, 0xFD76, 0x0639, 0x0645, 0x0645, 0, - 4, 0xFD77, 0x0639, 0x0645, 0x0645, 0, - 6, 0xFD78, 0x0639, 0x0645, 0x0649, 0, - 6, 0xFD79, 0x063A, 0x0645, 0x0645, 0, - 6, 0xFD7A, 0x063A, 0x0645, 0x064A, 0, - 6, 0xFD7B, 0x063A, 0x0645, 0x0649, 0, - 6, 0xFD7C, 0x0641, 0x062E, 0x0645, 0, - 4, 0xFD7D, 0x0641, 0x062E, 0x0645, 0, - 6, 0xFD7E, 0x0642, 0x0645, 0x062D, 0, - 6, 0xFD7F, 0x0642, 0x0645, 0x0645, 0, - 6, 0xFD80, 0x0644, 0x062D, 0x0645, 0, - 6, 0xFD81, 0x0644, 0x062D, 0x064A, 0, - 6, 0xFD82, 0x0644, 0x062D, 0x0649, 0, - 4, 0xFD83, 0x0644, 0x062C, 0x062C, 0, - 6, 0xFD84, 0x0644, 0x062C, 0x062C, 0, - 6, 0xFD85, 0x0644, 0x062E, 0x0645, 0, - 4, 0xFD86, 0x0644, 0x062E, 0x0645, 0, - 6, 0xFD87, 0x0644, 0x0645, 0x062D, 0, - 4, 0xFD88, 0x0644, 0x0645, 0x062D, 0, - 4, 0xFD89, 0x0645, 0x062D, 0x062C, 0, - 4, 0xFD8A, 0x0645, 0x062D, 0x0645, 0, - 6, 0xFD8B, 0x0645, 0x062D, 0x064A, 0, - 4, 0xFD8C, 0x0645, 0x062C, 0x062D, 0, - 4, 0xFD8D, 0x0645, 0x062C, 0x0645, 0, - 4, 0xFD8E, 0x0645, 0x062E, 0x062C, 0, - 4, 0xFD8F, 0x0645, 0x062E, 0x0645, 0, - 4, 0xFD92, 0x0645, 0x062C, 0x062E, 0, - 4, 0xFD93, 0x0647, 0x0645, 0x062C, 0, - 4, 0xFD94, 0x0647, 0x0645, 0x0645, 0, - 4, 0xFD95, 0x0646, 0x062D, 0x0645, 0, - 6, 0xFD96, 0x0646, 0x062D, 0x0649, 0, - 6, 0xFD97, 0x0646, 0x062C, 0x0645, 0, - 4, 0xFD98, 0x0646, 0x062C, 0x0645, 0, - 6, 0xFD99, 0x0646, 0x062C, 0x0649, 0, - 6, 0xFD9A, 0x0646, 0x0645, 0x064A, 0, - 6, 0xFD9B, 0x0646, 0x0645, 0x0649, 0, - 6, 0xFD9C, 0x064A, 0x0645, 0x0645, 0, - 4, 0xFD9D, 0x064A, 0x0645, 0x0645, 0, - 6, 0xFD9E, 0x0628, 0x062E, 0x064A, 0, - 6, 0xFD9F, 0x062A, 0x062C, 0x064A, 0, - 6, 0xFDA0, 0x062A, 0x062C, 0x0649, 0, - 6, 0xFDA1, 0x062A, 0x062E, 0x064A, 0, - 6, 0xFDA2, 0x062A, 0x062E, 0x0649, 0, - 6, 0xFDA3, 0x062A, 0x0645, 0x064A, 0, - 6, 0xFDA4, 0x062A, 0x0645, 0x0649, 0, - 6, 0xFDA5, 0x062C, 0x0645, 0x064A, 0, - 6, 0xFDA6, 0x062C, 0x062D, 0x0649, 0, - 6, 0xFDA7, 0x062C, 0x0645, 0x0649, 0, - 6, 0xFDA8, 0x0633, 0x062E, 0x0649, 0, - 6, 0xFDA9, 0x0635, 0x062D, 0x064A, 0, - 6, 0xFDAA, 0x0634, 0x062D, 0x064A, 0, - 6, 0xFDAB, 0x0636, 0x062D, 0x064A, 0, - 6, 0xFDAC, 0x0644, 0x062C, 0x064A, 0, - 6, 0xFDAD, 0x0644, 0x0645, 0x064A, 0, - 6, 0xFDAE, 0x064A, 0x062D, 0x064A, 0, - 6, 0xFDAF, 0x064A, 0x062C, 0x064A, 0, - 6, 0xFDB0, 0x064A, 0x0645, 0x064A, 0, - 6, 0xFDB1, 0x0645, 0x0645, 0x064A, 0, - 6, 0xFDB2, 0x0642, 0x0645, 0x064A, 0, - 6, 0xFDB3, 0x0646, 0x062D, 0x064A, 0, - 4, 0xFDB4, 0x0642, 0x0645, 0x062D, 0, - 4, 0xFDB5, 0x0644, 0x062D, 0x0645, 0, - 6, 0xFDB6, 0x0639, 0x0645, 0x064A, 0, - 6, 0xFDB7, 0x0643, 0x0645, 0x064A, 0, - 4, 0xFDB8, 0x0646, 0x062C, 0x062D, 0, - 6, 0xFDB9, 0x0645, 0x062E, 0x064A, 0, - 4, 0xFDBA, 0x0644, 0x062C, 0x0645, 0, - 6, 0xFDBB, 0x0643, 0x0645, 0x0645, 0, - 6, 0xFDBC, 0x0644, 0x062C, 0x0645, 0, - 6, 0xFDBD, 0x0646, 0x062C, 0x062D, 0, - 6, 0xFDBE, 0x062C, 0x062D, 0x064A, 0, - 6, 0xFDBF, 0x062D, 0x062C, 0x064A, 0, - 6, 0xFDC0, 0x0645, 0x062C, 0x064A, 0, - 6, 0xFDC1, 0x0641, 0x0645, 0x064A, 0, - 6, 0xFDC2, 0x0628, 0x062D, 0x064A, 0, - 4, 0xFDC3, 0x0643, 0x0645, 0x0645, 0, - 4, 0xFDC4, 0x0639, 0x062C, 0x0645, 0, - 4, 0xFDC5, 0x0635, 0x0645, 0x0645, 0, - 6, 0xFDC6, 0x0633, 0x062E, 0x064A, 0, - 6, 0xFDC7, 0x0646, 0x062C, 0x064A, 0, - 7, 0xFDF0, 0x0635, 0x0644, 0x06D2, 0, - 7, 0xFDF1, 0x0642, 0x0644, 0x06D2, 0, - 7, 0xFDF2, 0x0627, 0x0644, 0x0644, 0x0647, 0, - 7, 0xFDF3, 0x0627, 0x0643, 0x0628, 0x0631, 0, - 7, 0xFDF4, 0x0645, 0x062D, 0x0645, 0x062F, 0, - 7, 0xFDF5, 0x0635, 0x0644, 0x0639, 0x0645, 0, - 7, 0xFDF6, 0x0631, 0x0633, 0x0648, 0x0644, 0, - 7, 0xFDF7, 0x0639, 0x0644, 0x064A, 0x0647, 0, - 7, 0xFDF8, 0x0648, 0x0633, 0x0644, 0x0645, 0, - 7, 0xFDF9, 0x0635, 0x0644, 0x0649, 0, - 7, 0xFDFA, 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0, - 7, 0xFDFB, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647, 0, - 7, 0xFDFC, 0x0631, 0x06CC, 0x0627, 0x0644, 0, - 11, 0xFE30, 0x2025, 0, - 11, 0xFE31, 0x2014, 0, - 11, 0xFE32, 0x2013, 0, - 11, 0xFE33, 0x005F, 0, - 11, 0xFE34, 0x005F, 0, - 11, 0xFE35, 0x0028, 0, - 11, 0xFE36, 0x0029, 0, - 11, 0xFE37, 0x007B, 0, - 11, 0xFE38, 0x007D, 0, - 11, 0xFE39, 0x3014, 0, - 11, 0xFE3A, 0x3015, 0, - 11, 0xFE3B, 0x3010, 0, - 11, 0xFE3C, 0x3011, 0, - 11, 0xFE3D, 0x300A, 0, - 11, 0xFE3E, 0x300B, 0, - 11, 0xFE3F, 0x3008, 0, - 11, 0xFE40, 0x3009, 0, - 11, 0xFE41, 0x300C, 0, - 11, 0xFE42, 0x300D, 0, - 11, 0xFE43, 0x300E, 0, - 11, 0xFE44, 0x300F, 0, - 16, 0xFE49, 0x203E, 0, - 16, 0xFE4A, 0x203E, 0, - 16, 0xFE4B, 0x203E, 0, - 16, 0xFE4C, 0x203E, 0, - 16, 0xFE4D, 0x005F, 0, - 16, 0xFE4E, 0x005F, 0, - 16, 0xFE4F, 0x005F, 0, - 14, 0xFE50, 0x002C, 0, - 14, 0xFE51, 0x3001, 0, - 14, 0xFE52, 0x002E, 0, - 14, 0xFE54, 0x003B, 0, - 14, 0xFE55, 0x003A, 0, - 14, 0xFE56, 0x003F, 0, - 14, 0xFE57, 0x0021, 0, - 14, 0xFE58, 0x2014, 0, - 14, 0xFE59, 0x0028, 0, - 14, 0xFE5A, 0x0029, 0, - 14, 0xFE5B, 0x007B, 0, - 14, 0xFE5C, 0x007D, 0, - 14, 0xFE5D, 0x3014, 0, - 14, 0xFE5E, 0x3015, 0, - 14, 0xFE5F, 0x0023, 0, - 14, 0xFE60, 0x0026, 0, - 14, 0xFE61, 0x002A, 0, - 14, 0xFE62, 0x002B, 0, - 14, 0xFE63, 0x002D, 0, - 14, 0xFE64, 0x003C, 0, - 14, 0xFE65, 0x003E, 0, - 14, 0xFE66, 0x003D, 0, - 14, 0xFE68, 0x005C, 0, - 14, 0xFE69, 0x0024, 0, - 14, 0xFE6A, 0x0025, 0, - 14, 0xFE6B, 0x0040, 0, - 7, 0xFE70, 0x0020, 0x064B, 0, - 5, 0xFE71, 0x0640, 0x064B, 0, - 7, 0xFE72, 0x0020, 0x064C, 0, - 7, 0xFE74, 0x0020, 0x064D, 0, - 7, 0xFE76, 0x0020, 0x064E, 0, - 5, 0xFE77, 0x0640, 0x064E, 0, - 7, 0xFE78, 0x0020, 0x064F, 0, - 5, 0xFE79, 0x0640, 0x064F, 0, - 7, 0xFE7A, 0x0020, 0x0650, 0, - 5, 0xFE7B, 0x0640, 0x0650, 0, - 7, 0xFE7C, 0x0020, 0x0651, 0, - 5, 0xFE7D, 0x0640, 0x0651, 0, - 7, 0xFE7E, 0x0020, 0x0652, 0, - 5, 0xFE7F, 0x0640, 0x0652, 0, - 7, 0xFE80, 0x0621, 0, - 7, 0xFE81, 0x0622, 0, - 6, 0xFE82, 0x0622, 0, - 7, 0xFE83, 0x0623, 0, - 6, 0xFE84, 0x0623, 0, - 7, 0xFE85, 0x0624, 0, - 6, 0xFE86, 0x0624, 0, - 7, 0xFE87, 0x0625, 0, - 6, 0xFE88, 0x0625, 0, - 7, 0xFE89, 0x0626, 0, - 6, 0xFE8A, 0x0626, 0, - 4, 0xFE8B, 0x0626, 0, - 5, 0xFE8C, 0x0626, 0, - 7, 0xFE8D, 0x0627, 0, - 6, 0xFE8E, 0x0627, 0, - 7, 0xFE8F, 0x0628, 0, - 6, 0xFE90, 0x0628, 0, - 4, 0xFE91, 0x0628, 0, - 5, 0xFE92, 0x0628, 0, - 7, 0xFE93, 0x0629, 0, - 6, 0xFE94, 0x0629, 0, - 7, 0xFE95, 0x062A, 0, - 6, 0xFE96, 0x062A, 0, - 4, 0xFE97, 0x062A, 0, - 5, 0xFE98, 0x062A, 0, - 7, 0xFE99, 0x062B, 0, - 6, 0xFE9A, 0x062B, 0, - 4, 0xFE9B, 0x062B, 0, - 5, 0xFE9C, 0x062B, 0, - 7, 0xFE9D, 0x062C, 0, - 6, 0xFE9E, 0x062C, 0, - 4, 0xFE9F, 0x062C, 0, - 5, 0xFEA0, 0x062C, 0, - 7, 0xFEA1, 0x062D, 0, - 6, 0xFEA2, 0x062D, 0, - 4, 0xFEA3, 0x062D, 0, - 5, 0xFEA4, 0x062D, 0, - 7, 0xFEA5, 0x062E, 0, - 6, 0xFEA6, 0x062E, 0, - 4, 0xFEA7, 0x062E, 0, - 5, 0xFEA8, 0x062E, 0, - 7, 0xFEA9, 0x062F, 0, - 6, 0xFEAA, 0x062F, 0, - 7, 0xFEAB, 0x0630, 0, - 6, 0xFEAC, 0x0630, 0, - 7, 0xFEAD, 0x0631, 0, - 6, 0xFEAE, 0x0631, 0, - 7, 0xFEAF, 0x0632, 0, - 6, 0xFEB0, 0x0632, 0, - 7, 0xFEB1, 0x0633, 0, - 6, 0xFEB2, 0x0633, 0, - 4, 0xFEB3, 0x0633, 0, - 5, 0xFEB4, 0x0633, 0, - 7, 0xFEB5, 0x0634, 0, - 6, 0xFEB6, 0x0634, 0, - 4, 0xFEB7, 0x0634, 0, - 5, 0xFEB8, 0x0634, 0, - 7, 0xFEB9, 0x0635, 0, - 6, 0xFEBA, 0x0635, 0, - 4, 0xFEBB, 0x0635, 0, - 5, 0xFEBC, 0x0635, 0, - 7, 0xFEBD, 0x0636, 0, - 6, 0xFEBE, 0x0636, 0, - 4, 0xFEBF, 0x0636, 0, - 5, 0xFEC0, 0x0636, 0, - 7, 0xFEC1, 0x0637, 0, - 6, 0xFEC2, 0x0637, 0, - 4, 0xFEC3, 0x0637, 0, - 5, 0xFEC4, 0x0637, 0, - 7, 0xFEC5, 0x0638, 0, - 6, 0xFEC6, 0x0638, 0, - 4, 0xFEC7, 0x0638, 0, - 5, 0xFEC8, 0x0638, 0, - 7, 0xFEC9, 0x0639, 0, - 6, 0xFECA, 0x0639, 0, - 4, 0xFECB, 0x0639, 0, - 5, 0xFECC, 0x0639, 0, - 7, 0xFECD, 0x063A, 0, - 6, 0xFECE, 0x063A, 0, - 4, 0xFECF, 0x063A, 0, - 5, 0xFED0, 0x063A, 0, - 7, 0xFED1, 0x0641, 0, - 6, 0xFED2, 0x0641, 0, - 4, 0xFED3, 0x0641, 0, - 5, 0xFED4, 0x0641, 0, - 7, 0xFED5, 0x0642, 0, - 6, 0xFED6, 0x0642, 0, - 4, 0xFED7, 0x0642, 0, - 5, 0xFED8, 0x0642, 0, - 7, 0xFED9, 0x0643, 0, - 6, 0xFEDA, 0x0643, 0, - 4, 0xFEDB, 0x0643, 0, - 5, 0xFEDC, 0x0643, 0, - 7, 0xFEDD, 0x0644, 0, - 6, 0xFEDE, 0x0644, 0, - 4, 0xFEDF, 0x0644, 0, - 5, 0xFEE0, 0x0644, 0, - 7, 0xFEE1, 0x0645, 0, - 6, 0xFEE2, 0x0645, 0, - 4, 0xFEE3, 0x0645, 0, - 5, 0xFEE4, 0x0645, 0, - 7, 0xFEE5, 0x0646, 0, - 6, 0xFEE6, 0x0646, 0, - 4, 0xFEE7, 0x0646, 0, - 5, 0xFEE8, 0x0646, 0, - 7, 0xFEE9, 0x0647, 0, - 6, 0xFEEA, 0x0647, 0, - 4, 0xFEEB, 0x0647, 0, - 5, 0xFEEC, 0x0647, 0, - 7, 0xFEED, 0x0648, 0, - 6, 0xFEEE, 0x0648, 0, - 7, 0xFEEF, 0x0649, 0, - 6, 0xFEF0, 0x0649, 0, - 7, 0xFEF1, 0x064A, 0, - 6, 0xFEF2, 0x064A, 0, - 4, 0xFEF3, 0x064A, 0, - 5, 0xFEF4, 0x064A, 0, - 7, 0xFEF5, 0x0644, 0x0622, 0, - 6, 0xFEF6, 0x0644, 0x0622, 0, - 7, 0xFEF7, 0x0644, 0x0623, 0, - 6, 0xFEF8, 0x0644, 0x0623, 0, - 7, 0xFEF9, 0x0644, 0x0625, 0, - 6, 0xFEFA, 0x0644, 0x0625, 0, - 7, 0xFEFB, 0x0644, 0x0627, 0, - 6, 0xFEFC, 0x0644, 0x0627, 0, - 12, 0xFF01, 0x0021, 0, - 12, 0xFF02, 0x0022, 0, - 12, 0xFF03, 0x0023, 0, - 12, 0xFF04, 0x0024, 0, - 12, 0xFF05, 0x0025, 0, - 12, 0xFF06, 0x0026, 0, - 12, 0xFF07, 0x0027, 0, - 12, 0xFF08, 0x0028, 0, - 12, 0xFF09, 0x0029, 0, - 12, 0xFF0A, 0x002A, 0, - 12, 0xFF0B, 0x002B, 0, - 12, 0xFF0C, 0x002C, 0, - 12, 0xFF0D, 0x002D, 0, - 12, 0xFF0E, 0x002E, 0, - 12, 0xFF0F, 0x002F, 0, - 12, 0xFF10, 0x0030, 0, - 12, 0xFF11, 0x0031, 0, - 12, 0xFF12, 0x0032, 0, - 12, 0xFF13, 0x0033, 0, - 12, 0xFF14, 0x0034, 0, - 12, 0xFF15, 0x0035, 0, - 12, 0xFF16, 0x0036, 0, - 12, 0xFF17, 0x0037, 0, - 12, 0xFF18, 0x0038, 0, - 12, 0xFF19, 0x0039, 0, - 12, 0xFF1A, 0x003A, 0, - 12, 0xFF1B, 0x003B, 0, - 12, 0xFF1C, 0x003C, 0, - 12, 0xFF1D, 0x003D, 0, - 12, 0xFF1E, 0x003E, 0, - 12, 0xFF1F, 0x003F, 0, - 12, 0xFF20, 0x0040, 0, - 12, 0xFF21, 0x0041, 0, - 12, 0xFF22, 0x0042, 0, - 12, 0xFF23, 0x0043, 0, - 12, 0xFF24, 0x0044, 0, - 12, 0xFF25, 0x0045, 0, - 12, 0xFF26, 0x0046, 0, - 12, 0xFF27, 0x0047, 0, - 12, 0xFF28, 0x0048, 0, - 12, 0xFF29, 0x0049, 0, - 12, 0xFF2A, 0x004A, 0, - 12, 0xFF2B, 0x004B, 0, - 12, 0xFF2C, 0x004C, 0, - 12, 0xFF2D, 0x004D, 0, - 12, 0xFF2E, 0x004E, 0, - 12, 0xFF2F, 0x004F, 0, - 12, 0xFF30, 0x0050, 0, - 12, 0xFF31, 0x0051, 0, - 12, 0xFF32, 0x0052, 0, - 12, 0xFF33, 0x0053, 0, - 12, 0xFF34, 0x0054, 0, - 12, 0xFF35, 0x0055, 0, - 12, 0xFF36, 0x0056, 0, - 12, 0xFF37, 0x0057, 0, - 12, 0xFF38, 0x0058, 0, - 12, 0xFF39, 0x0059, 0, - 12, 0xFF3A, 0x005A, 0, - 12, 0xFF3B, 0x005B, 0, - 12, 0xFF3C, 0x005C, 0, - 12, 0xFF3D, 0x005D, 0, - 12, 0xFF3E, 0x005E, 0, - 12, 0xFF3F, 0x005F, 0, - 12, 0xFF40, 0x0060, 0, - 12, 0xFF41, 0x0061, 0, - 12, 0xFF42, 0x0062, 0, - 12, 0xFF43, 0x0063, 0, - 12, 0xFF44, 0x0064, 0, - 12, 0xFF45, 0x0065, 0, - 12, 0xFF46, 0x0066, 0, - 12, 0xFF47, 0x0067, 0, - 12, 0xFF48, 0x0068, 0, - 12, 0xFF49, 0x0069, 0, - 12, 0xFF4A, 0x006A, 0, - 12, 0xFF4B, 0x006B, 0, - 12, 0xFF4C, 0x006C, 0, - 12, 0xFF4D, 0x006D, 0, - 12, 0xFF4E, 0x006E, 0, - 12, 0xFF4F, 0x006F, 0, - 12, 0xFF50, 0x0070, 0, - 12, 0xFF51, 0x0071, 0, - 12, 0xFF52, 0x0072, 0, - 12, 0xFF53, 0x0073, 0, - 12, 0xFF54, 0x0074, 0, - 12, 0xFF55, 0x0075, 0, - 12, 0xFF56, 0x0076, 0, - 12, 0xFF57, 0x0077, 0, - 12, 0xFF58, 0x0078, 0, - 12, 0xFF59, 0x0079, 0, - 12, 0xFF5A, 0x007A, 0, - 12, 0xFF5B, 0x007B, 0, - 12, 0xFF5C, 0x007C, 0, - 12, 0xFF5D, 0x007D, 0, - 12, 0xFF5E, 0x007E, 0, - 12, 0xFF5F, 0x2985, 0, - 12, 0xFF60, 0x2986, 0, - 13, 0xFF61, 0x3002, 0, - 13, 0xFF62, 0x300C, 0, - 13, 0xFF63, 0x300D, 0, - 13, 0xFF64, 0x3001, 0, - 13, 0xFF65, 0x30FB, 0, - 13, 0xFF66, 0x30F2, 0, - 13, 0xFF67, 0x30A1, 0, - 13, 0xFF68, 0x30A3, 0, - 13, 0xFF69, 0x30A5, 0, - 13, 0xFF6A, 0x30A7, 0, - 13, 0xFF6B, 0x30A9, 0, - 13, 0xFF6C, 0x30E3, 0, - 13, 0xFF6D, 0x30E5, 0, - 13, 0xFF6E, 0x30E7, 0, - 13, 0xFF6F, 0x30C3, 0, - 13, 0xFF70, 0x30FC, 0, - 13, 0xFF71, 0x30A2, 0, - 13, 0xFF72, 0x30A4, 0, - 13, 0xFF73, 0x30A6, 0, - 13, 0xFF74, 0x30A8, 0, - 13, 0xFF75, 0x30AA, 0, - 13, 0xFF76, 0x30AB, 0, - 13, 0xFF77, 0x30AD, 0, - 13, 0xFF78, 0x30AF, 0, - 13, 0xFF79, 0x30B1, 0, - 13, 0xFF7A, 0x30B3, 0, - 13, 0xFF7B, 0x30B5, 0, - 13, 0xFF7C, 0x30B7, 0, - 13, 0xFF7D, 0x30B9, 0, - 13, 0xFF7E, 0x30BB, 0, - 13, 0xFF7F, 0x30BD, 0, - 13, 0xFF80, 0x30BF, 0, - 13, 0xFF81, 0x30C1, 0, - 13, 0xFF82, 0x30C4, 0, - 13, 0xFF83, 0x30C6, 0, - 13, 0xFF84, 0x30C8, 0, - 13, 0xFF85, 0x30CA, 0, - 13, 0xFF86, 0x30CB, 0, - 13, 0xFF87, 0x30CC, 0, - 13, 0xFF88, 0x30CD, 0, - 13, 0xFF89, 0x30CE, 0, - 13, 0xFF8A, 0x30CF, 0, - 13, 0xFF8B, 0x30D2, 0, - 13, 0xFF8C, 0x30D5, 0, - 13, 0xFF8D, 0x30D8, 0, - 13, 0xFF8E, 0x30DB, 0, - 13, 0xFF8F, 0x30DE, 0, - 13, 0xFF90, 0x30DF, 0, - 13, 0xFF91, 0x30E0, 0, - 13, 0xFF92, 0x30E1, 0, - 13, 0xFF93, 0x30E2, 0, - 13, 0xFF94, 0x30E4, 0, - 13, 0xFF95, 0x30E6, 0, - 13, 0xFF96, 0x30E8, 0, - 13, 0xFF97, 0x30E9, 0, - 13, 0xFF98, 0x30EA, 0, - 13, 0xFF99, 0x30EB, 0, - 13, 0xFF9A, 0x30EC, 0, - 13, 0xFF9B, 0x30ED, 0, - 13, 0xFF9C, 0x30EF, 0, - 13, 0xFF9D, 0x30F3, 0, - 13, 0xFF9E, 0x3099, 0, - 13, 0xFF9F, 0x309A, 0, - 13, 0xFFA0, 0x3164, 0, - 13, 0xFFA1, 0x3131, 0, - 13, 0xFFA2, 0x3132, 0, - 13, 0xFFA3, 0x3133, 0, - 13, 0xFFA4, 0x3134, 0, - 13, 0xFFA5, 0x3135, 0, - 13, 0xFFA6, 0x3136, 0, - 13, 0xFFA7, 0x3137, 0, - 13, 0xFFA8, 0x3138, 0, - 13, 0xFFA9, 0x3139, 0, - 13, 0xFFAA, 0x313A, 0, - 13, 0xFFAB, 0x313B, 0, - 13, 0xFFAC, 0x313C, 0, - 13, 0xFFAD, 0x313D, 0, - 13, 0xFFAE, 0x313E, 0, - 13, 0xFFAF, 0x313F, 0, - 13, 0xFFB0, 0x3140, 0, - 13, 0xFFB1, 0x3141, 0, - 13, 0xFFB2, 0x3142, 0, - 13, 0xFFB3, 0x3143, 0, - 13, 0xFFB4, 0x3144, 0, - 13, 0xFFB5, 0x3145, 0, - 13, 0xFFB6, 0x3146, 0, - 13, 0xFFB7, 0x3147, 0, - 13, 0xFFB8, 0x3148, 0, - 13, 0xFFB9, 0x3149, 0, - 13, 0xFFBA, 0x314A, 0, - 13, 0xFFBB, 0x314B, 0, - 13, 0xFFBC, 0x314C, 0, - 13, 0xFFBD, 0x314D, 0, - 13, 0xFFBE, 0x314E, 0, - 13, 0xFFC2, 0x314F, 0, - 13, 0xFFC3, 0x3150, 0, - 13, 0xFFC4, 0x3151, 0, - 13, 0xFFC5, 0x3152, 0, - 13, 0xFFC6, 0x3153, 0, - 13, 0xFFC7, 0x3154, 0, - 13, 0xFFCA, 0x3155, 0, - 13, 0xFFCB, 0x3156, 0, - 13, 0xFFCC, 0x3157, 0, - 13, 0xFFCD, 0x3158, 0, - 13, 0xFFCE, 0x3159, 0, - 13, 0xFFCF, 0x315A, 0, - 13, 0xFFD2, 0x315B, 0, - 13, 0xFFD3, 0x315C, 0, - 13, 0xFFD4, 0x315D, 0, - 13, 0xFFD5, 0x315E, 0, - 13, 0xFFD6, 0x315F, 0, - 13, 0xFFD7, 0x3160, 0, - 13, 0xFFDA, 0x3161, 0, - 13, 0xFFDB, 0x3162, 0, - 13, 0xFFDC, 0x3163, 0, - 12, 0xFFE0, 0x00A2, 0, - 12, 0xFFE1, 0x00A3, 0, - 12, 0xFFE2, 0x00AC, 0, - 12, 0xFFE3, 0x00AF, 0, - 12, 0xFFE4, 0x00A6, 0, - 12, 0xFFE5, 0x00A5, 0, - 12, 0xFFE6, 0x20A9, 0, - 13, 0xFFE8, 0x2502, 0, - 13, 0xFFE9, 0x2190, 0, - 13, 0xFFEA, 0x2191, 0, - 13, 0xFFEB, 0x2192, 0, - 13, 0xFFEC, 0x2193, 0, - 13, 0xFFED, 0x25A0, 0, - 13, 0xFFEE, 0x25CB, 0, - -}; - -const TQ_UINT16 TQUnicodeTables::decomposition_info[] = { - 1, 2, 3, 4, 5, 6, 7, 8, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 17, 18, - 19, 20, 21, 22, 23, 8, 8, 8, - 8, 8, 24, 8, 8, 8, 25, 26, - 27, 28, 29, 30, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 31, 32, 33, 34, 35, 36, 37, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 10, 0, 0, 0, 0, 14, - 0, 0, 19, 23, 27, 32, 0, 0, - 36, 41, 45, 0, 49, 55, 61, 0, - 67, 72, 77, 82, 87, 92, 0, 97, - 102, 107, 112, 117, 122, 127, 132, 137, - 0, 142, 147, 152, 157, 162, 167, 0, - 0, 172, 177, 182, 187, 192, 0, 0, - 197, 202, 207, 212, 217, 222, 0, 227, - 232, 237, 242, 247, 252, 257, 262, 267, - 0, 272, 277, 282, 287, 292, 297, 0, - 0, 302, 307, 312, 317, 322, 0, 327, - - 332, 337, 342, 347, 352, 357, 362, 367, - 372, 377, 382, 387, 392, 397, 402, 407, - 0, 0, 412, 417, 422, 427, 432, 437, - 442, 447, 452, 457, 462, 467, 472, 477, - 482, 487, 492, 497, 502, 507, 0, 0, - 512, 517, 522, 527, 532, 537, 542, 547, - 552, 0, 557, 562, 567, 572, 577, 582, - 0, 587, 592, 597, 602, 607, 612, 617, - 622, 0, 0, 627, 632, 637, 642, 647, - 652, 657, 0, 0, 662, 667, 672, 677, - 682, 687, 0, 0, 692, 697, 702, 707, - 712, 717, 722, 727, 732, 737, 742, 747, - 752, 757, 762, 767, 772, 777, 0, 0, - 782, 787, 792, 797, 802, 807, 812, 817, - 822, 827, 832, 837, 842, 847, 852, 857, - 862, 867, 872, 877, 882, 887, 892, 897, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 901, 906, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 911, - 916, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 921, 926, 931, 936, - 941, 946, 951, 956, 961, 966, 971, 976, - 981, 986, 991, 996, 1001, 1006, 1011, 1016, - 1021, 1026, 1031, 1036, 1041, 0, 1046, 1051, - 1056, 1061, 1066, 1071, 0, 0, 1076, 1081, - 1086, 1091, 1096, 1101, 1106, 1111, 1116, 1121, - 1126, 1131, 1136, 1141, 1146, 1151, 0, 0, - 1156, 1161, 1166, 1171, 1176, 1181, 1186, 1191, - - 1196, 1201, 1206, 1211, 1216, 1221, 1226, 1231, - 1236, 1241, 1246, 1251, 1256, 1261, 1266, 1271, - 1276, 1281, 1286, 1291, 1296, 1301, 1306, 1311, - 1316, 1321, 1326, 1331, 0, 0, 1336, 1341, - 0, 0, 0, 0, 0, 0, 1346, 1351, - 1356, 1361, 1366, 1371, 1376, 1381, 1386, 1391, - 1396, 1401, 1406, 1411, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1416, 1420, 1424, 1428, 1432, 1436, 1440, 1444, - 1448, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1452, 1457, 1462, 1467, 1472, 1477, 0, 0, - 1482, 1486, 1490, 1494, 1498, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1502, 1506, 0, 1510, 1514, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1519, 0, 0, 0, - 0, 0, 1523, 0, 0, 0, 1528, 0, - 0, 0, 0, 0, 1532, 1537, 1542, 1547, - 1551, 1556, 1561, 0, 1566, 0, 1571, 1576, - 1581, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1586, 1591, 1596, 1601, 1606, 1611, - 1616, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1621, 1626, 1631, 1636, 1641, 0, - 1646, 1650, 1654, 1658, 1663, 1668, 1672, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1676, 1680, 1684, 0, 1688, 1692, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 1696, 1701, 0, 1706, 0, 0, 0, 1711, - 0, 0, 0, 0, 1716, 1721, 1726, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1731, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1736, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1741, 1746, 0, 1751, 0, 0, 0, 1756, - 0, 0, 0, 0, 1761, 1766, 1771, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1776, 1781, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1786, 1791, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1796, 1801, 1806, 1811, 0, 0, 1816, 1821, - 0, 0, 1826, 1831, 1836, 1841, 1846, 1851, - 0, 0, 1856, 1861, 1866, 1871, 1876, 1881, - 0, 0, 1886, 1891, 1896, 1901, 1906, 1911, - 1916, 1921, 1926, 1931, 1936, 1941, 0, 0, - 1946, 1951, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1956, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1961, 1966, 1971, 1976, 1981, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1986, 1991, 1996, - 2001, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2006, 0, 2011, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2016, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2021, 0, 0, 0, 0, 0, 0, - 0, 2026, 0, 0, 2031, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2036, 2041, 2046, 2051, 2056, 2061, 2066, 2071, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2076, 2081, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2086, 2091, 0, 2096, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2101, 0, 0, 2106, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2111, 2116, 2121, 0, 0, 2126, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2131, 0, 0, 2136, 2141, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2146, 2151, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2156, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2161, 2166, 2171, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2176, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2181, 0, 0, 0, 0, 0, 0, 2186, - 2191, 0, 2196, 2201, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2206, 2211, 2216, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2221, 0, 2226, 2231, 2236, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2241, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2246, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2251, 2256, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2261, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2270, 0, 0, - 0, 0, 2275, 0, 0, 0, 0, 2280, - 0, 0, 0, 0, 2285, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2290, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2295, 0, 2300, 2305, 2310, - 2315, 2320, 0, 0, 0, 0, 0, 0, - 0, 2325, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2330, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2335, 0, 0, - 0, 0, 2340, 0, 0, 0, 0, 2345, - 0, 0, 0, 0, 2350, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2355, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2360, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 2365, 2370, 2375, 2380, 2385, 2390, 2395, 2400, - 2405, 2410, 2415, 2420, 2425, 2430, 2435, 2440, - 2445, 2450, 2455, 2460, 2465, 2470, 2475, 2480, - 2485, 2490, 2495, 2500, 2505, 2510, 2515, 2520, - 2525, 2530, 2535, 2540, 2545, 2550, 2555, 2560, - 2565, 2570, 2575, 2580, 2585, 2590, 2595, 2600, - 2605, 2610, 2615, 2620, 2625, 2630, 2635, 2640, - 2645, 2650, 2655, 2660, 2665, 2670, 2675, 2680, - 2685, 2690, 2695, 2700, 2705, 2710, 2715, 2720, - 2725, 2730, 2735, 2740, 2745, 2750, 2755, 2760, - 2765, 2770, 2775, 2780, 2785, 2790, 2795, 2800, - 2805, 2810, 2815, 2820, 2825, 2830, 2835, 2840, - 2845, 2850, 2855, 2860, 2865, 2870, 2875, 2880, - 2885, 2890, 2895, 2900, 2905, 2910, 2915, 2920, - 2925, 2930, 2935, 2940, 2945, 2950, 2955, 2960, - 2965, 2970, 2975, 2980, 2985, 2990, 2995, 3000, - 3005, 3010, 3015, 3020, 3025, 3030, 3035, 3040, - 3045, 3050, 3055, 3060, 3065, 3070, 3075, 3080, - 3085, 3090, 3095, 3100, 3105, 3110, 3115, 3120, - 3125, 3130, 3135, 3140, 0, 0, 0, 0, - 3145, 3150, 3155, 3160, 3165, 3170, 3175, 3180, - 3185, 3190, 3195, 3200, 3205, 3210, 3215, 3220, - 3225, 3230, 3235, 3240, 3245, 3250, 3255, 3260, - 3265, 3270, 3275, 3280, 3285, 3290, 3295, 3300, - 3305, 3310, 3315, 3320, 3325, 3330, 3335, 3340, - 3345, 3350, 3355, 3360, 3365, 3370, 3375, 3380, - 3385, 3390, 3395, 3400, 3405, 3410, 3415, 3420, - 3425, 3430, 3435, 3440, 3445, 3450, 3455, 3460, - 3465, 3470, 3475, 3480, 3485, 3490, 3495, 3500, - 3505, 3510, 3515, 3520, 3525, 3530, 3535, 3540, - 3545, 3550, 3555, 3560, 3565, 3570, 3575, 3580, - 3585, 3590, 0, 0, 0, 0, 0, 0, - - 3595, 3600, 3605, 3610, 3615, 3620, 3625, 3630, - 3635, 3640, 3645, 3650, 3655, 3660, 3665, 3670, - 3675, 3680, 3685, 3690, 3695, 3700, 0, 0, - 3705, 3710, 3715, 3720, 3725, 3730, 0, 0, - 3735, 3740, 3745, 3750, 3755, 3760, 3765, 3770, - 3775, 3780, 3785, 3790, 3795, 3800, 3805, 3810, - 3815, 3820, 3825, 3830, 3835, 3840, 3845, 3850, - 3855, 3860, 3865, 3870, 3875, 3880, 3885, 3890, - 3895, 3900, 3905, 3910, 3915, 3920, 0, 0, - 3925, 3930, 3935, 3940, 3945, 3950, 0, 0, - 3955, 3960, 3965, 3970, 3975, 3980, 3985, 3990, - 0, 3995, 0, 4000, 0, 4005, 0, 4010, - 4015, 4020, 4025, 4030, 4035, 4040, 4045, 4050, - 4055, 4060, 4065, 4070, 4075, 4080, 4085, 4090, - 4095, 4100, 4104, 4109, 4113, 4118, 4122, 4127, - 4131, 4136, 4140, 4145, 4149, 4154, 0, 0, - 4158, 4163, 4168, 4173, 4178, 4183, 4188, 4193, - 4198, 4203, 4208, 4213, 4218, 4223, 4228, 4233, - 4238, 4243, 4248, 4253, 4258, 4263, 4268, 4273, - 4278, 4283, 4288, 4293, 4298, 4303, 4308, 4313, - 4318, 4323, 4328, 4333, 4338, 4343, 4348, 4353, - 4358, 4363, 4368, 4373, 4378, 4383, 4388, 4393, - 4398, 4403, 4408, 4413, 4418, 0, 4423, 4428, - 4433, 4438, 4443, 4448, 4452, 4457, 4462, 4466, - 4471, 4476, 4481, 4486, 4491, 0, 4496, 4501, - 4506, 4511, 4515, 4520, 4524, 4529, 4534, 4539, - 4544, 4549, 4554, 4559, 0, 0, 4563, 4568, - 4573, 4578, 4583, 4588, 0, 4592, 4597, 4602, - 4607, 4612, 4617, 4622, 4626, 4631, 4636, 4641, - 4646, 4651, 4656, 4661, 4665, 4670, 4675, 4679, - 0, 0, 4683, 4688, 4693, 0, 4698, 4703, - 4708, 4713, 4717, 4722, 4726, 4731, 4735, 0, - - 4740, 4744, 4748, 4752, 4756, 4760, 4764, 4768, - 4772, 4776, 4780, 0, 0, 0, 0, 0, - 0, 4784, 0, 0, 0, 0, 0, 4788, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4793, 4797, 4802, 0, - 0, 0, 0, 0, 0, 0, 0, 4808, - 0, 0, 0, 4812, 4817, 0, 4823, 4828, - 0, 0, 0, 0, 4834, 0, 4839, 0, - 0, 0, 0, 0, 0, 0, 0, 4844, - 4849, 4854, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4859, - 0, 0, 0, 0, 0, 0, 0, 4866, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4870, 4874, 0, 0, 4878, 4882, 4886, 4890, - 4894, 4898, 4902, 4906, 4910, 4914, 4918, 4922, - 4926, 4930, 4934, 4938, 4942, 4946, 4950, 4954, - 4958, 4962, 4966, 4970, 4974, 4978, 4982, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4986, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 4991, 4997, 5003, 5007, 0, 5012, 5018, 5024, - 0, 5028, 5033, 5037, 5041, 5045, 5049, 5053, - 5057, 5061, 5065, 5069, 0, 5073, 5077, 0, - 0, 5082, 5086, 5090, 5094, 5098, 0, 0, - 5102, 5107, 5113, 0, 5118, 0, 5122, 0, - 5126, 0, 5130, 5134, 5138, 5142, 0, 5146, - 5150, 5154, 0, 5158, 5162, 5166, 5170, 5174, - 5178, 5182, 0, 0, 0, 5186, 5190, 5194, - 5198, 0, 0, 0, 0, 5202, 5206, 5210, - 5214, 5218, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5222, 5228, 5234, 5240, 5246, - 5252, 5258, 5264, 5270, 5276, 5282, 5288, 5294, - 5299, 5303, 5308, 5314, 5319, 5323, 5328, 5334, - 5341, 5346, 5350, 5355, 5361, 5365, 5369, 5373, - 5377, 5381, 5386, 5392, 5397, 5401, 5406, 5412, - 5419, 5424, 5428, 5433, 5439, 5443, 5447, 5451, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5455, 5460, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5465, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5470, 5475, 5480, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 5485, 0, 0, 0, - 0, 5490, 0, 0, 5495, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5500, 0, 5505, 0, - 0, 0, 0, 0, 5510, 5515, 0, 5521, - 5526, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5532, 0, 0, 5537, 0, 0, 5542, - 0, 5547, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 5552, 0, 5557, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5562, 5567, 5572, - 5577, 5582, 0, 0, 5587, 5592, 0, 0, - 5597, 5602, 0, 0, 0, 0, 0, 0, - 5607, 5612, 0, 0, 5617, 5622, 0, 0, - 5627, 5632, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5637, 5642, 5647, 5652, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 5657, 5662, 5667, 5672, 0, 0, 0, 0, - 0, 0, 5677, 5682, 5687, 5692, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5697, 5701, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 5705, 5709, 5713, 5717, 5721, 5725, 5729, 5733, - 5737, 5741, 5746, 5751, 5756, 5761, 5766, 5771, - 5776, 5781, 5786, 5791, 5796, 5802, 5808, 5814, - 5820, 5826, 5832, 5838, 5844, 5850, 5857, 5864, - 5871, 5878, 5885, 5892, 5899, 5906, 5913, 5920, - 5927, 5932, 5937, 5942, 5947, 5952, 5957, 5962, - 5967, 5972, 5978, 5984, 5990, 5996, 6002, 6008, - 6014, 6020, 6026, 6032, 6038, 6044, 6050, 6056, - 6062, 6068, 6074, 6080, 6086, 6092, 6098, 6104, - 6110, 6116, 6122, 6128, 6134, 6140, 6146, 6152, - 6158, 6164, 6170, 6176, 6182, 6188, 6194, 6198, - 6202, 6206, 6210, 6214, 6218, 6222, 6226, 6230, - 6234, 6238, 6242, 6246, 6250, 6254, 6258, 6262, - 6266, 6270, 6274, 6278, 6282, 6286, 6290, 6294, - 6298, 6302, 6306, 6310, 6314, 6318, 6322, 6326, - 6330, 6334, 6338, 6342, 6346, 6350, 6354, 6358, - 6362, 6366, 6370, 6374, 6378, 6382, 6386, 6390, - 6394, 6398, 6402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6406, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6413, 6419, 6424, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6430, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6435, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6439, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 6443, 6447, 6451, 6455, 6459, 6463, 6467, 6471, - 6475, 6479, 6483, 6487, 6491, 6495, 6499, 6503, - 6507, 6511, 6515, 6519, 6523, 6527, 6531, 6535, - 6539, 6543, 6547, 6551, 6555, 6559, 6563, 6567, - 6571, 6575, 6579, 6583, 6587, 6591, 6595, 6599, - 6603, 6607, 6611, 6615, 6619, 6623, 6627, 6631, - 6635, 6639, 6643, 6647, 6651, 6655, 6659, 6663, - 6667, 6671, 6675, 6679, 6683, 6687, 6691, 6695, - 6699, 6703, 6707, 6711, 6715, 6719, 6723, 6727, - 6731, 6735, 6739, 6743, 6747, 6751, 6755, 6759, - 6763, 6767, 6771, 6775, 6779, 6783, 6787, 6791, - 6795, 6799, 6803, 6807, 6811, 6815, 6819, 6823, - 6827, 6831, 6835, 6839, 6843, 6847, 6851, 6855, - 6859, 6863, 6867, 6871, 6875, 6879, 6883, 6887, - 6891, 6895, 6899, 6903, 6907, 6911, 6915, 6919, - 6923, 6927, 6931, 6935, 6939, 6943, 6947, 6951, - 6955, 6959, 6963, 6967, 6971, 6975, 6979, 6983, - 6987, 6991, 6995, 6999, 7003, 7007, 7011, 7015, - 7019, 7023, 7027, 7031, 7035, 7039, 7043, 7047, - 7051, 7055, 7059, 7063, 7067, 7071, 7075, 7079, - 7083, 7087, 7091, 7095, 7099, 7103, 7107, 7111, - 7115, 7119, 7123, 7127, 7131, 7135, 7139, 7143, - 7147, 7151, 7155, 7159, 7163, 7167, 7171, 7175, - 7179, 7183, 7187, 7191, 7195, 7199, 7203, 7207, - 7211, 7215, 7219, 7223, 7227, 7231, 7235, 7239, - 7243, 7247, 7251, 7255, 7259, 7263, 7267, 7271, - 7275, 7279, 7283, 7287, 7291, 7295, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 7299, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7303, 0, - 7307, 7311, 7315, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7319, 0, 7324, 0, - 7329, 0, 7334, 0, 7339, 0, 7344, 0, - 7349, 0, 7354, 0, 7359, 0, 7364, 0, - 7369, 0, 7374, 0, 0, 7379, 0, 7384, - 0, 7389, 0, 0, 0, 0, 0, 0, - 7394, 7399, 0, 7404, 7409, 0, 7414, 7419, - 0, 7424, 7429, 0, 7434, 7439, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7444, 0, 0, 0, - 0, 0, 0, 7449, 7454, 0, 7459, 7464, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7469, 0, 7474, 0, - 7479, 0, 7484, 0, 7489, 0, 7494, 0, - 7499, 0, 7504, 0, 7509, 0, 7514, 0, - 7519, 0, 7524, 0, 0, 7529, 0, 7534, - 0, 7539, 0, 0, 0, 0, 0, 0, - 7544, 7549, 0, 7554, 7559, 0, 7564, 7569, - 0, 7574, 7579, 0, 7584, 7589, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7594, 0, 0, 7599, - 7604, 7609, 7614, 0, 0, 0, 7619, 7624, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7629, 7633, 7637, 7641, 7645, 7649, 7653, - 7657, 7661, 7665, 7669, 7673, 7677, 7681, 7685, - 7689, 7693, 7697, 7701, 7705, 7709, 7713, 7717, - 7721, 7725, 7729, 7733, 7737, 7741, 7745, 7749, - 7753, 7757, 7761, 7765, 7769, 7773, 7777, 7781, - 7785, 7789, 7793, 7797, 7801, 7805, 7809, 7813, - 7817, 7821, 7825, 7829, 7833, 7837, 7841, 7845, - 7849, 7853, 7857, 7861, 7865, 7869, 7873, 7877, - 7881, 7885, 7889, 7893, 7897, 7901, 7905, 7909, - 7913, 7917, 7921, 7925, 7929, 7933, 7937, 7941, - 7945, 7949, 7953, 7957, 7961, 7965, 7969, 7973, - 7977, 7981, 7985, 7989, 7993, 7997, 8001, 0, - 0, 0, 8005, 8009, 8013, 8017, 8021, 8025, - 8029, 8033, 8037, 8041, 8045, 8049, 8053, 8057, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 8061, 8067, 8073, 8079, 8085, 8091, 8097, 8103, - 8109, 8115, 8121, 8127, 8133, 8139, 8145, 8152, - 8159, 8166, 8173, 8180, 8187, 8194, 8201, 8208, - 8215, 8222, 8229, 8236, 8243, 0, 0, 0, - 8250, 8256, 8262, 8268, 8274, 8280, 8286, 8292, - 8298, 8304, 8310, 8316, 8322, 8328, 8334, 8340, - 8346, 8352, 8358, 8364, 8370, 8376, 8382, 8388, - 8394, 8400, 8406, 8412, 8418, 8424, 8430, 8436, - 8442, 8448, 8454, 8460, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8466, 8471, 8476, 8481, 8486, 8491, 8496, - 8501, 8506, 8511, 8516, 8521, 8526, 8531, 8536, - 8541, 8545, 8549, 8553, 8557, 8561, 8565, 8569, - 8573, 8577, 8581, 8585, 8589, 8593, 8597, 8602, - 8607, 8612, 8617, 8622, 8627, 8632, 8637, 8642, - 8647, 8652, 8657, 8662, 0, 0, 0, 0, - 8667, 8671, 8675, 8679, 8683, 8687, 8691, 8695, - 8699, 8703, 8707, 8711, 8715, 8719, 8723, 8727, - 8731, 8735, 8739, 8743, 8747, 8751, 8755, 8759, - 8763, 8767, 8771, 8775, 8779, 8783, 8787, 8791, - 8795, 8799, 8803, 8807, 8811, 8815, 8819, 8823, - 8827, 8831, 8835, 8839, 8843, 8847, 8851, 8855, - 8859, 8863, 8868, 8873, 8878, 8883, 8888, 8893, - 8898, 8903, 8908, 8913, 8918, 8923, 8928, 8933, - 8938, 8943, 8948, 8953, 8958, 8963, 8968, 8973, - 8978, 8983, 8989, 8995, 0, 0, 0, 0, - 9001, 9005, 9009, 9013, 9017, 9021, 9025, 9029, - 9033, 9037, 9041, 9045, 9049, 9053, 9057, 9061, - 9065, 9069, 9073, 9077, 9081, 9085, 9089, 9093, - 9097, 9101, 9105, 9109, 9113, 9117, 9121, 9125, - 9129, 9133, 9137, 9141, 9145, 9149, 9153, 9157, - 9161, 9165, 9169, 9173, 9177, 9181, 9185, 0, - - 9189, 9196, 9203, 9210, 9216, 9223, 9229, 9235, - 9243, 9250, 9256, 9262, 9268, 9275, 9282, 9288, - 9294, 9299, 9305, 9312, 9319, 9324, 9332, 9341, - 9349, 9355, 9363, 9371, 9378, 9384, 9390, 9396, - 9403, 9411, 9418, 9424, 9430, 9436, 9441, 9446, - 9451, 9456, 9462, 9468, 9476, 9482, 9489, 9497, - 9503, 9508, 9513, 9521, 9528, 9536, 9542, 9550, - 9555, 9561, 9567, 9573, 9579, 9585, 9592, 9598, - 9603, 9609, 9615, 9621, 9628, 9634, 9640, 9646, - 9654, 9661, 9666, 9674, 9679, 9686, 9693, 9699, - 9705, 9711, 9718, 9723, 9729, 9736, 9741, 9749, - 9755, 9760, 9765, 9770, 9775, 9780, 9785, 9790, - 9795, 9800, 9805, 9811, 9817, 9823, 9829, 9835, - 9841, 9847, 9853, 9859, 9865, 9871, 9877, 9883, - 9889, 9895, 9901, 9906, 9911, 9917, 9922, 0, - 0, 0, 0, 9927, 9932, 9937, 9942, 9947, - 9954, 9959, 9964, 9969, 9974, 9979, 9984, 9989, - 9994, 10000, 10007, 10012, 10017, 10022, 10027, 10032, - 10037, 10042, 10048, 10054, 10060, 10066, 10071, 10076, - 10081, 10086, 10091, 10096, 10101, 10106, 10111, 10116, - 10122, 10128, 10133, 10139, 10145, 10151, 10156, 10162, - 10168, 10175, 10180, 10186, 10192, 10198, 10204, 10212, - 10221, 10226, 10231, 10236, 10241, 10246, 10251, 10256, - 10261, 10266, 10271, 10276, 10281, 10286, 10291, 10296, - 10301, 10306, 10311, 10318, 10323, 10328, 10333, 10340, - 10346, 10351, 10356, 10361, 10366, 10371, 10376, 10381, - 10386, 10391, 10396, 10402, 10407, 10412, 10418, 10424, - 10429, 10436, 10442, 10447, 10452, 10457, 0, 0, - 10462, 10467, 10472, 10477, 10482, 10487, 10492, 10497, - 10502, 10507, 10513, 10519, 10525, 10531, 10537, 10543, - 10549, 10555, 10561, 10567, 10573, 10579, 10585, 10591, - 10597, 10603, 10609, 10615, 10621, 10627, 10633, 0, - - 10639, 10643, 10647, 10651, 10655, 10659, 10663, 10667, - 10671, 10675, 10679, 10683, 10687, 10691, 10695, 10699, - 10703, 10707, 10711, 10715, 10719, 10723, 10727, 10731, - 10735, 10739, 10743, 10747, 10751, 10755, 10759, 10763, - 10767, 10771, 10775, 10779, 10783, 10787, 10791, 10795, - 10799, 10803, 10807, 10811, 10815, 10819, 10823, 10827, - 10831, 10835, 10839, 10843, 10847, 10851, 10855, 10859, - 10863, 10867, 10871, 10875, 10879, 10883, 10887, 10891, - 10895, 10899, 10903, 10907, 10911, 10915, 10919, 10923, - 10927, 10931, 10935, 10939, 10943, 10947, 10951, 10955, - 10959, 10963, 10967, 10971, 10975, 10979, 10983, 10987, - 10991, 10995, 10999, 11003, 11007, 11011, 11015, 11019, - 11023, 11027, 11031, 11035, 11039, 11043, 11047, 11051, - 11055, 11059, 11063, 11067, 11071, 11075, 11079, 11083, - 11087, 11091, 11095, 11099, 11103, 11107, 11111, 11115, - 11119, 11123, 11127, 11131, 11135, 11139, 11143, 11147, - 11151, 11155, 11159, 11163, 11167, 11171, 11175, 11179, - 11183, 11187, 11191, 11195, 11199, 11203, 11207, 11211, - 11215, 11219, 11223, 11227, 11231, 11235, 11239, 11243, - 11247, 11251, 11255, 11259, 11263, 11267, 11271, 11275, - 11279, 11283, 11287, 11291, 11295, 11299, 11303, 11307, - 11311, 11315, 11319, 11323, 11327, 11331, 11335, 11339, - 11343, 11347, 11351, 11355, 11359, 11363, 11367, 11371, - 11375, 11379, 11383, 11387, 11391, 11395, 11399, 11403, - 11407, 11411, 11415, 11419, 11423, 11427, 11431, 11435, - 11439, 11443, 11447, 11451, 11455, 11459, 11463, 11467, - 11471, 11475, 11479, 11483, 11487, 11491, 11495, 11499, - 11503, 11507, 11511, 11515, 11519, 11523, 11527, 11531, - 11535, 11539, 11543, 11547, 11551, 11555, 11559, 11563, - 11567, 11571, 11575, 11579, 11583, 11587, 11591, 11595, - 11599, 11603, 11607, 11611, 11615, 11619, 11623, 11627, - 11631, 11635, 11639, 11643, 11647, 11651, 11655, 11659, - - 11663, 11667, 11671, 11675, 11679, 11683, 11687, 11691, - 11695, 11699, 11703, 11707, 11711, 11715, 0, 0, - 11719, 0, 11723, 0, 0, 11727, 11731, 11735, - 11739, 11743, 11747, 11751, 11755, 11759, 11763, 0, - 11767, 0, 11771, 0, 0, 11775, 11779, 0, - 0, 0, 11783, 11787, 11791, 11795, 0, 0, - 11799, 11803, 11807, 11811, 11815, 11819, 11823, 11827, - 11831, 11835, 11839, 11843, 11847, 11851, 11855, 11859, - 11863, 11867, 11871, 11875, 11879, 11883, 11887, 11891, - 11895, 11899, 11903, 11907, 11911, 11915, 11919, 11923, - 11927, 11931, 11935, 11939, 11943, 11947, 11951, 11955, - 11959, 11963, 11967, 11971, 11975, 11979, 11983, 11987, - 11991, 11995, 11999, 12003, 12007, 12011, 12015, 12019, - 12023, 12027, 12031, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 12035, 12040, 12045, 12050, 12056, 12062, 12067, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12072, 12077, 12082, 12087, 12092, - 0, 0, 0, 0, 0, 12097, 0, 12102, - 12107, 12111, 12115, 12119, 12123, 12127, 12131, 12135, - 12139, 12143, 12147, 12152, 12157, 12162, 12167, 12172, - 12177, 12182, 12187, 12192, 12197, 12202, 12207, 0, - 12212, 12217, 12222, 12227, 12232, 0, 12237, 0, - 12242, 12247, 0, 12252, 12257, 0, 12262, 12267, - 12272, 12277, 12282, 12287, 12292, 12297, 12302, 12307, - 12312, 12316, 12320, 12324, 12328, 12332, 12336, 12340, - 12344, 12348, 12352, 12356, 12360, 12364, 12368, 12372, - 12376, 12380, 12384, 12388, 12392, 12396, 12400, 12404, - 12408, 12412, 12416, 12420, 12424, 12428, 12432, 12436, - 12440, 12444, 12448, 12452, 12456, 12460, 12464, 12468, - 12472, 12476, 12480, 12484, 12488, 12492, 12496, 12500, - 12504, 12508, 12512, 12516, 12520, 12524, 12528, 12532, - 12536, 12540, 12544, 12548, 12552, 12556, 12560, 12564, - 12568, 12572, 12576, 12580, 12584, 12588, 12592, 12596, - 12600, 12604, 12608, 12612, 12616, 12620, 12624, 12628, - 12632, 12636, 12640, 12644, 12648, 12652, 12656, 12660, - 12664, 12668, 12672, 12676, 12680, 12684, 12688, 12692, - 12696, 12700, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12704, 12708, 12712, 12716, 12720, - 12724, 12728, 12732, 12736, 12740, 12744, 12748, 12752, - 12756, 12760, 12764, 12768, 12772, 12776, 12780, 12784, - 12788, 12792, 12796, 12801, 12806, 12811, 12816, 12821, - 12826, 12831, 12836, 12841, 12846, 12851, 12856, 12861, - 12866, 12871, 12876, 12881, 12886, 12890, 12894, 12898, - - 12902, 12907, 12912, 12917, 12922, 12927, 12932, 12937, - 12942, 12947, 12952, 12957, 12962, 12967, 12972, 12977, - 12982, 12987, 12992, 12997, 13002, 13007, 13012, 13017, - 13022, 13027, 13032, 13037, 13042, 13047, 13052, 13057, - 13062, 13067, 13072, 13077, 13082, 13087, 13092, 13097, - 13102, 13107, 13112, 13117, 13122, 13127, 13132, 13137, - 13142, 13147, 13152, 13157, 13162, 13167, 13172, 13177, - 13182, 13187, 13192, 13197, 13202, 13207, 13212, 13217, - 13222, 13227, 13232, 13237, 13242, 13247, 13252, 13257, - 13262, 13267, 13272, 13277, 13282, 13287, 13292, 13297, - 13302, 13307, 13312, 13317, 13322, 13327, 13332, 13337, - 13342, 13347, 13352, 13357, 13362, 13367, 13372, 13378, - 13384, 13390, 13396, 13402, 13408, 13413, 13418, 13423, - 13428, 13433, 13438, 13443, 13448, 13453, 13458, 13463, - 13468, 13473, 13478, 13483, 13488, 13493, 13498, 13503, - 13508, 13513, 13518, 13523, 13528, 13533, 13538, 13543, - 13548, 13553, 13558, 13563, 13568, 13573, 13578, 13583, - 13588, 13593, 13598, 13603, 13608, 13613, 13618, 13623, - 13628, 13633, 13638, 13643, 13648, 13653, 13658, 13663, - 13668, 13673, 13678, 13683, 13688, 13693, 13698, 13703, - 13708, 13713, 13718, 13723, 13728, 13733, 13738, 13743, - 13748, 13753, 13758, 13763, 13768, 13773, 13778, 13783, - 13788, 13793, 13798, 13803, 13808, 13813, 13818, 13823, - 13828, 13833, 13838, 13843, 13848, 13853, 13858, 13863, - 13868, 13873, 13878, 13883, 13888, 13893, 13898, 13903, - 13908, 13913, 13918, 13923, 13928, 13933, 13938, 13943, - 13948, 13953, 13958, 13963, 13968, 13973, 13978, 13983, - 13988, 13993, 13998, 14003, 14008, 14013, 14018, 14023, - 14028, 14033, 14038, 14043, 14048, 14053, 14058, 14063, - 14068, 14073, 14078, 14083, 14088, 14093, 14098, 14103, - 14108, 14113, 14118, 14124, 14130, 14136, 14141, 14146, - 14151, 14156, 14161, 14166, 14171, 14176, 14181, 14186, - - 14191, 14196, 14201, 14206, 14211, 14216, 14221, 14226, - 14231, 14236, 14241, 14246, 14251, 14256, 14261, 14266, - 14271, 14276, 14281, 14286, 14291, 14296, 14301, 14306, - 14311, 14316, 14321, 14326, 14331, 14336, 14341, 14346, - 14351, 14356, 14361, 14366, 14371, 14376, 14381, 14386, - 14391, 14396, 14401, 14406, 14411, 14416, 14421, 14426, - 14431, 14436, 14441, 14446, 14451, 14456, 14461, 14466, - 14471, 14476, 14481, 14486, 14491, 14496, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 14501, 14507, 14513, 14519, 14525, 14531, 14537, 14543, - 14549, 14555, 14561, 14567, 14573, 14579, 14585, 14591, - 14597, 14603, 14609, 14615, 14621, 14627, 14633, 14639, - 14645, 14651, 14657, 14663, 14669, 14675, 14681, 14687, - 14693, 14699, 14705, 14711, 14717, 14723, 14729, 14735, - 14741, 14747, 14753, 14759, 14765, 14771, 14777, 14783, - 14789, 14795, 14801, 14807, 14813, 14819, 14825, 14831, - 14837, 14843, 14849, 14855, 14861, 14867, 14873, 14879, - 0, 0, 14885, 14891, 14897, 14903, 14909, 14915, - 14921, 14927, 14933, 14939, 14945, 14951, 14957, 14963, - 14969, 14975, 14981, 14987, 14993, 14999, 15005, 15011, - 15017, 15023, 15029, 15035, 15041, 15047, 15053, 15059, - 15065, 15071, 15077, 15083, 15089, 15095, 15101, 15107, - 15113, 15119, 15125, 15131, 15137, 15143, 15149, 15155, - 15161, 15167, 15173, 15179, 15185, 15191, 15197, 15203, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 15209, 15215, 15221, 15228, 15235, 15242, 15249, 15256, - 15263, 15270, 15276, 15297, 15308, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 15315, 15319, 15323, 15327, 15331, 15335, 15339, 15343, - 15347, 15351, 15355, 15359, 15363, 15367, 15371, 15375, - 15379, 15383, 15387, 15391, 15395, 0, 0, 0, - 0, 15399, 15403, 15407, 15411, 15415, 15419, 15423, - 15427, 15431, 15435, 0, 15439, 15443, 15447, 15451, - 15455, 15459, 15463, 15467, 15471, 15475, 15479, 15483, - 15487, 15491, 15495, 15499, 15503, 15507, 15511, 0, - 15515, 15519, 15523, 15527, 0, 0, 0, 0, - 15531, 15536, 15541, 0, 15546, 0, 15551, 15556, - 15561, 15566, 15571, 15576, 15581, 15586, 15591, 15596, - 15601, 15605, 15609, 15613, 15617, 15621, 15625, 15629, - 15633, 15637, 15641, 15645, 15649, 15653, 15657, 15661, - 15665, 15669, 15673, 15677, 15681, 15685, 15689, 15693, - 15697, 15701, 15705, 15709, 15713, 15717, 15721, 15725, - 15729, 15733, 15737, 15741, 15745, 15749, 15753, 15757, - 15761, 15765, 15769, 15773, 15777, 15781, 15785, 15789, - 15793, 15797, 15801, 15805, 15809, 15813, 15817, 15821, - 15825, 15829, 15833, 15837, 15841, 15845, 15849, 15853, - 15857, 15861, 15865, 15869, 15873, 15877, 15881, 15885, - 15889, 15893, 15897, 15901, 15905, 15909, 15913, 15917, - 15921, 15925, 15929, 15933, 15937, 15941, 15945, 15949, - 15953, 15957, 15961, 15965, 15969, 15973, 15977, 15981, - 15985, 15989, 15993, 15997, 16001, 16005, 16009, 16013, - 16017, 16021, 16025, 16029, 16033, 16037, 16041, 16045, - 16049, 16053, 16057, 16061, 16065, 16069, 16074, 16079, - 16084, 16089, 16094, 16099, 16104, 0, 0, 0, - - 0, 16109, 16113, 16117, 16121, 16125, 16129, 16133, - 16137, 16141, 16145, 16149, 16153, 16157, 16161, 16165, - 16169, 16173, 16177, 16181, 16185, 16189, 16193, 16197, - 16201, 16205, 16209, 16213, 16217, 16221, 16225, 16229, - 16233, 16237, 16241, 16245, 16249, 16253, 16257, 16261, - 16265, 16269, 16273, 16277, 16281, 16285, 16289, 16293, - 16297, 16301, 16305, 16309, 16313, 16317, 16321, 16325, - 16329, 16333, 16337, 16341, 16345, 16349, 16353, 16357, - 16361, 16365, 16369, 16373, 16377, 16381, 16385, 16389, - 16393, 16397, 16401, 16405, 16409, 16413, 16417, 16421, - 16425, 16429, 16433, 16437, 16441, 16445, 16449, 16453, - 16457, 16461, 16465, 16469, 16473, 16477, 16481, 16485, - 16489, 16493, 16497, 16501, 16505, 16509, 16513, 16517, - 16521, 16525, 16529, 16533, 16537, 16541, 16545, 16549, - 16553, 16557, 16561, 16565, 16569, 16573, 16577, 16581, - 16585, 16589, 16593, 16597, 16601, 16605, 16609, 16613, - 16617, 16621, 16625, 16629, 16633, 16637, 16641, 16645, - 16649, 16653, 16657, 16661, 16665, 16669, 16673, 16677, - 16681, 16685, 16689, 16693, 16697, 16701, 16705, 16709, - 16713, 16717, 16721, 16725, 16729, 16733, 16737, 16741, - 16745, 16749, 16753, 16757, 16761, 16765, 16769, 16773, - 16777, 16781, 16785, 16789, 16793, 16797, 16801, 16805, - 16809, 16813, 16817, 16821, 16825, 16829, 16833, 16837, - 16841, 16845, 16849, 16853, 16857, 16861, 16865, 0, - 0, 0, 16869, 16873, 16877, 16881, 16885, 16889, - 0, 0, 16893, 16897, 16901, 16905, 16909, 16913, - 0, 0, 16917, 16921, 16925, 16929, 16933, 16937, - 0, 0, 16941, 16945, 16949, 0, 0, 0, - 16953, 16957, 16961, 16965, 16969, 16973, 16977, 0, - 16981, 16985, 16989, 16993, 16997, 17001, 17005, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -}; - -// 67552 bytes - -const TQ_UINT16 TQUnicodeTables::ligature_map[] = { - 0, - 5567, 0, - 5552, 0, - 5572, 0, - 67, 72, 77, 82, 87, 92, 332, 342, 352, 966, 1196, 1206, 1346, 2365, 3145, 3155, 0, - 2375, 2385, 2395, 0, - 97, 362, 372, 382, 392, 0, - 402, 2415, 2425, 2435, 2445, 2455, 0, - 102, 107, 112, 117, 412, 422, 432, 442, 452, 1216, 1226, 1356, 2485, 2495, 3265, 3275, 3285, 0, - 2515, 0, - 462, 472, 482, 492, 1076, 1146, 2525, 0, - 502, 1336, 2535, 2545, 2555, 2565, 2575, 0, - 122, 127, 132, 137, 512, 522, 532, 542, 552, 976, 1236, 1246, 2585, 3345, 3355, 0, - 567, 0, - 577, 1086, 2605, 2615, 2625, 0, - 587, 597, 607, 2635, 2655, 2665, 0, - 2675, 2685, 2695, 0, - 142, 627, 637, 647, 1156, 2705, 2715, 2725, 2735, 0, - 147, 152, 157, 162, 167, 662, 672, 682, 901, 986, 1096, 1256, 1266, 1386, 3365, 3375, 0, - 2785, 2795, 0, - 692, 702, 712, 1276, 1286, 2805, 2815, 2835, 0, - 722, 732, 742, 752, 1316, 2845, 2855, 0, - 762, 772, 1326, 2895, 2905, 2915, 2925, 0, - 172, 177, 182, 187, 782, 792, 802, 812, 822, 832, 911, 996, 1296, 1306, 2935, 2945, 2955, 3485, 3495, 0, - 2985, 2995, 0, - 842, 3005, 3015, 3025, 3035, 3045, 0, - 3055, 3065, 0, - 192, 852, 862, 1406, 3075, 3555, 3565, 3575, 3585, 0, - 867, 877, 887, 3085, 3095, 3105, 0, - 197, 202, 207, 212, 217, 222, 337, 347, 357, 971, 1201, 1211, 1351, 2370, 3150, 3160, 0, - 2380, 2390, 2400, 0, - 227, 367, 377, 387, 397, 0, - 407, 2420, 2430, 2440, 2450, 2460, 0, - 232, 237, 242, 247, 417, 427, 437, 447, 457, 1221, 1231, 1361, 2490, 2500, 3270, 3280, 3290, 0, - 2520, 0, - 467, 477, 487, 497, 1081, 1151, 2530, 0, - 507, 1341, 2540, 2550, 2560, 2570, 2580, 3115, 0, - 252, 257, 262, 267, 517, 527, 537, 547, 981, 1241, 1251, 2590, 3350, 3360, 0, - 572, 1126, 0, - 582, 1091, 2610, 2620, 2630, 0, - 592, 602, 612, 2640, 2660, 2670, 0, - 2680, 2690, 2700, 0, - 272, 632, 642, 652, 1161, 2710, 2720, 2730, 2740, 0, - 277, 282, 287, 292, 297, 667, 677, 687, 906, 991, 1101, 1261, 1271, 1391, 3370, 3380, 0, - 2790, 2800, 0, - 697, 707, 717, 1281, 1291, 2810, 2820, 2840, 0, - 727, 737, 747, 757, 1321, 2850, 2860, 0, - 767, 777, 1331, 2900, 2910, 2920, 2930, 3120, 0, - 302, 307, 312, 317, 787, 797, 807, 817, 827, 837, 916, 1001, 1301, 1311, 2940, 2950, 2960, 3490, 3500, 0, - 2990, 3000, 0, - 847, 3010, 3020, 3030, 3040, 3050, 3125, 0, - 3060, 3070, 0, - 322, 327, 857, 1411, 3080, 3130, 3560, 3570, 3580, 3590, 0, - 872, 882, 892, 3090, 3100, 3110, 0, - 1537, 4476, 4670, 0, - 3165, 3175, 3185, 3195, 0, - 1046, 0, - 1166, 0, - 1066, 1176, 0, - 2405, 0, - 3295, 3305, 3315, 3325, 0, - 2595, 0, - 3385, 3395, 3405, 3415, 0, - 1376, 2745, 2755, 0, - 1366, 0, - 1186, 0, - 1006, 1016, 1026, 1036, 0, - 3170, 3180, 3190, 3200, 0, - 1051, 0, - 1171, 0, - 1071, 1181, 0, - 2410, 0, - 3300, 3310, 3320, 3330, 0, - 2600, 0, - 3390, 3400, 3410, 3420, 0, - 1381, 2750, 2760, 0, - 1371, 0, - 1191, 0, - 1011, 1021, 1031, 1041, 0, - 3215, 3225, 3235, 3245, 0, - 3220, 3230, 3240, 3250, 0, - 2465, 2475, 0, - 2470, 2480, 0, - 2765, 2775, 0, - 2770, 2780, 0, - 2865, 0, - 2870, 0, - 2875, 0, - 2880, 0, - 2965, 0, - 2970, 0, - 2975, 0, - 2980, 0, - 3140, 0, - 3435, 3445, 3455, 3465, 3475, 0, - 3440, 3450, 3460, 3470, 3480, 0, - 3505, 3515, 3525, 3535, 3545, 0, - 3510, 3520, 3530, 3540, 3550, 0, - 1116, 0, - 1106, 0, - 1111, 0, - 1056, 0, - 1061, 0, - 2505, 0, - 2510, 0, - 1396, 0, - 1401, 0, - 1121, 0, - 1514, 0, - 1542, 3635, 3640, 4433, 4438, 4443, 4452, 0, - 1551, 3705, 3710, 4506, 0, - 1556, 3775, 3780, 4515, 4524, 0, - 1561, 1586, 3855, 3860, 4573, 4578, 4583, 0, - 1566, 3925, 3930, 4708, 0, - 4665, 0, - 1571, 1591, 3995, 4646, 4651, 4656, 0, - 1576, 4055, 4060, 4717, 4726, 0, - 4418, 0, - 4491, 0, - 1596, 3595, 3600, 4095, 4398, 4403, 4413, 4423, 0, - 1601, 3675, 3680, 4104, 0, - 1606, 3735, 3740, 4113, 4486, 4496, 0, - 1611, 1621, 3815, 3820, 4122, 4544, 4549, 4563, 0, - 1631, 3895, 3900, 4131, 0, - 4626, 4631, 0, - 1626, 1636, 3955, 3960, 4140, 4607, 4612, 4636, 0, - 1641, 4015, 4020, 4149, 4688, 4698, 0, - 1581, 4554, 4568, 0, - 1616, 4617, 4641, 0, - 4693, 0, - 1658, 1663, 0, - 1711, 0, - 1796, 1806, 0, - 1706, 0, - 1696, 1701, 1816, 0, - 1786, 1836, 0, - 1846, 0, - 1721, 1731, 1856, 1866, 0, - 1716, 0, - 1876, 0, - 1726, 1906, 1916, 1926, 0, - 1936, 0, - 1946, 0, - 1896, 0, - 1801, 1811, 0, - 1751, 0, - 1741, 1746, 1821, 0, - 1791, 1841, 0, - 1851, 0, - 1736, 1766, 1861, 1871, 0, - 1761, 0, - 1881, 0, - 1771, 1911, 1921, 1931, 0, - 1941, 0, - 1951, 0, - 1901, 0, - 1756, 0, - 1776, 0, - 1781, 0, - 1826, 0, - 1831, 0, - 1886, 0, - 1891, 0, - 12167, 12172, 12177, 0, - 12182, 12292, 0, - 12187, 0, - 12192, 0, - 12197, 0, - 12202, 12287, 0, - 12207, 0, - 12212, 0, - 12097, 12217, 0, - 12222, 0, - 12227, 12297, 0, - 12232, 0, - 12237, 0, - 12242, 0, - 12247, 0, - 12252, 0, - 12257, 12302, 0, - 12262, 0, - 12267, 0, - 12272, 0, - 12147, 12152, 12277, 0, - 12282, 0, - 12102, 0, - 1961, 1966, 1976, 0, - 1971, 0, - 1981, 0, - 2011, 0, - 2016, 0, - 2006, 0, - 2036, 0, - 2041, 0, - 2046, 0, - 2051, 0, - 2056, 0, - 2061, 0, - 2021, 0, - 2066, 0, - 2071, 0, - 2026, 0, - 2031, 0, - 2086, 0, - 2091, 0, - 2096, 0, - 2076, 2081, 0, - 2111, 0, - 2116, 0, - 2121, 0, - 2126, 0, - 2101, 0, - 2106, 0, - 2146, 0, - 2151, 0, - 2131, 2136, 2141, 0, - 2156, 0, - 2161, 2171, 0, - 2166, 0, - 2176, 0, - 2181, 0, - 2186, 2191, 2196, 0, - 2201, 0, - 2206, 2216, 0, - 2211, 0, - 2221, 2226, 2236, 0, - 2231, 0, - 2290, 0, - 2265, 0, - 2270, 0, - 2275, 0, - 2280, 0, - 2285, 0, - 2295, 2300, 2325, 0, - 2355, 0, - 2330, 0, - 2335, 0, - 2340, 0, - 2345, 0, - 2350, 0, - 2305, 0, - 2315, 0, - 2360, 0, - 2645, 0, - 2650, 0, - 2825, 0, - 2830, 0, - 2885, 0, - 2890, 0, - 3205, 3255, 0, - 3210, 3260, 0, - 3335, 0, - 3340, 0, - 3425, 0, - 3430, 0, - 3605, 3615, 3625, 4158, 0, - 3610, 3620, 3630, 4163, 0, - 4168, 0, - 4173, 0, - 4178, 0, - 4183, 0, - 4188, 0, - 4193, 0, - 3645, 3655, 3665, 4198, 0, - 3650, 3660, 3670, 4203, 0, - 4208, 0, - 4213, 0, - 4218, 0, - 4223, 0, - 4228, 0, - 4233, 0, - 3685, 3695, 0, - 3690, 3700, 0, - 3715, 3725, 0, - 3720, 3730, 0, - 3745, 3755, 3765, 4238, 0, - 3750, 3760, 3770, 4243, 0, - 4248, 0, - 4253, 0, - 4258, 0, - 4263, 0, - 4268, 0, - 4273, 0, - 3785, 3795, 3805, 4278, 0, - 3790, 3800, 3810, 4283, 0, - 4288, 0, - 4293, 0, - 4298, 0, - 4303, 0, - 4308, 0, - 4313, 0, - 3825, 3835, 3845, 0, - 3830, 3840, 3850, 0, - 3865, 3875, 3885, 0, - 3870, 3880, 3890, 0, - 3905, 3915, 0, - 3910, 3920, 0, - 3935, 3945, 0, - 3940, 3950, 0, - 3965, 3975, 3985, 0, - 3970, 3980, 3990, 0, - 4000, 4005, 4010, 0, - 4025, 4035, 4045, 4318, 0, - 4030, 4040, 4050, 4323, 0, - 4328, 0, - 4333, 0, - 4338, 0, - 4343, 0, - 4348, 0, - 4353, 0, - 4065, 4075, 4085, 4358, 0, - 4070, 4080, 4090, 4363, 0, - 4368, 0, - 4373, 0, - 4378, 0, - 4383, 0, - 4388, 0, - 4393, 0, - 4408, 0, - 4481, 0, - 4683, 0, - 4428, 0, - 4529, 4534, 4539, 0, - 4501, 0, - 4703, 0, - 4592, 4597, 4602, 0, - 5455, 0, - 5460, 0, - 5465, 0, - 5470, 0, - 5480, 0, - 5475, 0, - 5485, 0, - 5490, 0, - 5495, 0, - 5500, 0, - 5505, 0, - 5532, 0, - 5537, 0, - 5542, 0, - 5547, 0, - 5562, 0, - 5557, 0, - 5577, 0, - 5582, 0, - 5587, 0, - 5592, 0, - 5597, 0, - 5602, 0, - 5607, 0, - 5612, 0, - 5657, 0, - 5662, 0, - 5617, 0, - 5622, 0, - 5627, 0, - 5632, 0, - 5667, 0, - 5672, 0, - 5637, 0, - 5642, 0, - 5647, 0, - 5652, 0, - 5677, 0, - 5682, 0, - 5687, 0, - 5692, 0, - 6430, 0, - 7444, 0, - 7319, 0, - 7324, 0, - 7329, 0, - 7334, 0, - 7339, 0, - 7344, 0, - 7349, 0, - 7354, 0, - 7359, 0, - 7364, 0, - 7369, 0, - 7374, 0, - 7379, 0, - 7384, 0, - 7389, 0, - 7394, 7399, 0, - 7404, 7409, 0, - 7414, 7419, 0, - 7424, 7429, 0, - 7434, 7439, 0, - 7459, 0, - 7594, 0, - 7469, 0, - 7474, 0, - 7479, 0, - 7484, 0, - 7489, 0, - 7494, 0, - 7499, 0, - 7504, 0, - 7509, 0, - 7514, 0, - 7519, 0, - 7524, 0, - 7529, 0, - 7534, 0, - 7539, 0, - 7544, 7549, 0, - 7554, 7559, 0, - 7564, 7569, 0, - 7574, 7579, 0, - 7584, 7589, 0, - 7599, 0, - 7604, 0, - 7609, 0, - 7614, 0, - 7619, 0, - 12157, 12162, 0, - -}; - -const TQ_UINT16 TQUnicodeTables::ligature_info[] = { - 1, 2, 3, 4, 5, 6, 7, 8, - 8, 9, 10, 11, 12, 13, 8, 14, - 15, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 16, 17, - 8, 18, 19, 8, 8, 8, 8, 8, - 8, 8, 20, 8, 8, 8, 8, 8, - 21, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 22, 8, 8, 8, 8, - - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 3, 5, 0, - 0, 7, 24, 28, 34, 41, 59, 61, - 69, 77, 93, 95, 101, 108, 112, 122, - 139, 0, 142, 151, 159, 167, 187, 190, - 197, 200, 210, 0, 0, 0, 0, 0, - 0, 217, 234, 238, 244, 251, 269, 271, - 279, 288, 303, 306, 312, 319, 323, 333, - 350, 0, 353, 362, 370, 379, 399, 402, - 410, 413, 424, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 431, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 435, 0, 440, 442, 444, 447, - 0, 0, 449, 0, 0, 0, 0, 454, - 0, 0, 0, 0, 456, 461, 465, 0, - 467, 0, 0, 0, 469, 0, 0, 0, - 0, 0, 474, 0, 479, 481, 483, 486, - 0, 0, 488, 0, 0, 0, 0, 493, - 0, 0, 0, 0, 495, 500, 504, 0, - 506, 0, 0, 0, 508, 0, 0, 0, - - 0, 0, 513, 518, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 523, 526, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 529, 532, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 535, 537, 0, 0, 0, 0, - 539, 541, 0, 0, 0, 0, 0, 0, - 543, 545, 547, 549, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 551, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 553, 559, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 565, - 571, 0, 0, 0, 0, 0, 0, 577, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 579, 581, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 583, 585, - 587, 589, 0, 0, 0, 0, 591, 593, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 599, 0, 0, 0, 607, 0, 612, - 0, 618, 0, 0, 0, 0, 0, 626, - 0, 631, 0, 0, 0, 633, 0, 0, - 0, 640, 0, 0, 646, 0, 648, 0, - 0, 650, 0, 0, 0, 659, 0, 664, - 0, 671, 0, 0, 0, 0, 0, 680, - 0, 685, 0, 0, 0, 688, 0, 0, - 0, 697, 704, 708, 0, 0, 712, 0, - 0, 0, 714, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 717, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 719, 0, 0, 722, 0, 724, 728, 731, - 733, 0, 738, 0, 0, 0, 740, 0, - 0, 0, 0, 742, 0, 0, 0, 747, - 0, 0, 0, 749, 0, 751, 0, 0, - 753, 0, 0, 756, 0, 758, 762, 765, - 767, 0, 772, 0, 0, 0, 774, 0, - 0, 0, 0, 776, 0, 0, 0, 781, - 0, 0, 0, 783, 0, 785, 0, 0, - 0, 0, 0, 0, 0, 0, 787, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 789, 791, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 793, 795, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 797, 799, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 801, 805, 808, 810, 812, 814, 817, 0, - 819, 821, 824, 826, 829, 0, 831, 0, - 833, 835, 0, 837, 839, 0, 842, 844, - 846, 848, 852, 0, 0, 0, 0, 0, - 0, 0, 854, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 856, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 860, 0, 862, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 864, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 866, 0, 0, 868, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 870, 872, 874, - 0, 0, 0, 0, 876, 0, 0, 0, - 0, 878, 880, 0, 0, 0, 0, 0, - 882, 0, 0, 884, 0, 0, 0, 886, - 888, 0, 0, 890, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 892, 894, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 896, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 898, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 901, 903, - 0, 0, 0, 0, 905, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 907, 0, 0, 0, 0, - 0, 0, 909, 0, 0, 0, 0, 0, - 911, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 913, 915, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 917, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 921, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 923, 926, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 928, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 930, - 0, 0, 0, 0, 0, 0, 932, 0, - 0, 0, 936, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 938, 941, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 943, 0, 0, 947, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 949, 0, 951, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 953, 0, 0, 0, - 0, 955, 0, 0, 0, 0, 957, 0, - 0, 0, 0, 959, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 961, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 965, 0, 967, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 969, 0, 0, 0, - 0, 971, 0, 0, 0, 0, 973, 0, - 0, 0, 0, 975, 0, 0, 0, 0, - 0, 0, 977, 979, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 981, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 983, 985, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 987, 989, 0, 0, 0, 0, - 0, 0, 991, 993, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 995, 998, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1001, 1003, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1005, 1007, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 1009, 1014, 1019, 1021, 1023, 1025, 1027, 1029, - 1031, 1036, 1041, 1043, 1045, 1047, 1049, 1051, - 1053, 1056, 0, 0, 0, 0, 0, 0, - 1059, 1062, 0, 0, 0, 0, 0, 0, - 1065, 1070, 1075, 1077, 1079, 1081, 1083, 1085, - 1087, 1092, 1097, 1099, 1101, 1103, 1105, 1107, - 1109, 1113, 0, 0, 0, 0, 0, 0, - 1117, 1121, 0, 0, 0, 0, 0, 0, - 1125, 1128, 0, 0, 0, 0, 0, 0, - 1131, 1134, 0, 0, 0, 0, 0, 0, - 1137, 1141, 0, 0, 0, 0, 0, 0, - 0, 1145, 0, 0, 0, 0, 0, 0, - 1149, 1154, 1159, 1161, 1163, 1165, 1167, 1169, - 1171, 1176, 1181, 1183, 1185, 1187, 1189, 1191, - 1193, 0, 0, 0, 1195, 0, 0, 0, - 0, 0, 0, 0, 1197, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1199, 0, - 0, 0, 0, 0, 0, 0, 0, 1201, - 0, 0, 0, 0, 0, 0, 1205, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1207, 0, - 0, 0, 0, 0, 0, 0, 1209, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1213, 0, 1215, 0, 1217, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1219, 0, 1221, 0, 1223, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 1225, 0, 0, 0, 0, - 1227, 0, 0, 1229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1231, 0, 1233, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1235, 0, 0, 0, - 0, 0, 0, 1237, 0, 1239, 0, 0, - 1241, 0, 0, 0, 0, 1243, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1245, 0, 0, 1247, 1249, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1251, 1253, 0, 0, 1255, 1257, - 0, 0, 1259, 1261, 1263, 1265, 0, 0, - 0, 0, 1267, 1269, 0, 0, 1271, 1273, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1275, 1277, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1279, 0, 0, 0, 0, 0, - 1281, 1283, 0, 1285, 0, 0, 0, 0, - 0, 0, 1287, 1289, 1291, 1293, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1295, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1297, 0, - 0, 0, 0, 1299, 0, 1301, 0, 1303, - 0, 1305, 0, 1307, 0, 1309, 0, 1311, - 0, 1313, 0, 1315, 0, 1317, 0, 1319, - 0, 1321, 0, 0, 1323, 0, 1325, 0, - 1327, 0, 0, 0, 0, 0, 0, 1329, - 0, 0, 1332, 0, 0, 1335, 0, 0, - 1338, 0, 0, 1341, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1344, 0, 0, - 0, 0, 0, 0, 0, 0, 1346, 0, - 0, 0, 0, 1348, 0, 1350, 0, 1352, - 0, 1354, 0, 1356, 0, 1358, 0, 1360, - 0, 1362, 0, 1364, 0, 1366, 0, 1368, - 0, 1370, 0, 0, 1372, 0, 1374, 0, - 1376, 0, 0, 0, 0, 0, 0, 1378, - 0, 0, 1381, 0, 0, 1384, 0, 0, - 1387, 0, 0, 1390, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1393, - 1395, 1397, 1399, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1401, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1403, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -}; - -// 14586 bytes - -const TQ_UINT8 TQUnicodeTables::direction_info[] = { - 1, 2, 3, 4, 5, 6, 7, 8, - 2, 9, 10, 11, 12, 13, 14, 15, - 16, 2, 2, 2, 2, 2, 17, 18, - 19, 2, 2, 2, 2, 2, 2, 20, - 21, 22, 23, 24, 25, 26, 27, 28, - 26, 29, 30, 2, 2, 2, 31, 32, - 33, 2, 34, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 35, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 36, 37, 38, 39, 40, - - - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 8, 7, 8, 9, 7, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 7, 7, 7, 8, - 9, 10, 10, 4, 4, 4, 10, 10, - 138, 138, 10, 4, 6, 4, 6, 3, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 6, 10, 138, 10, 138, 10, - 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 138, 10, 138, 10, 10, - 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 138, 10, 138, 10, 18, - 18, 18, 18, 18, 18, 7, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 6, 10, 4, 4, 4, 4, 10, 10, - 10, 10, 0, 138, 10, 10, 10, 10, - 4, 4, 2, 2, 10, 0, 10, 10, - 10, 2, 0, 138, 10, 10, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 10, 0, 0, 0, 0, 0, - 0, 0, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 0, 0, 0, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 0, 0, 0, 0, 10, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 0, 10, 10, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 17, 17, 17, 17, 0, - 17, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 0, 0, 0, - 0, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 0, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 0, 17, 17, 17, 1, 17, - 1, 17, 17, 1, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 13, 0, 0, 0, 13, - 0, 13, 77, 77, 77, 77, 45, 77, - 45, 77, 45, 45, 45, 45, 45, 77, - 77, 77, 77, 45, 45, 45, 45, 45, - 45, 45, 45, 0, 0, 0, 0, 0, - 109, 45, 45, 45, 45, 45, 45, 45, - 77, 45, 45, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 4, 5, 5, 13, 45, 45, - 17, 77, 77, 77, 13, 77, 77, 77, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 77, 45, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 45, 77, 45, 77, - 45, 45, 77, 77, 13, 77, 17, 17, - 17, 17, 17, 17, 17, 13, 17, 17, - 17, 17, 17, 17, 17, 13, 13, 17, - 17, 10, 17, 17, 17, 17, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 45, 45, 45, 13, 13, 0, - - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 0, 18, - 77, 17, 45, 45, 45, 77, 77, 77, - 77, 77, 45, 45, 45, 45, 77, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 77, 45, 77, 45, 77, 0, 0, 0, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 17, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, - 0, 17, 17, 17, 17, 17, 17, 17, - 17, 0, 0, 0, 0, 17, 0, 0, - 0, 17, 17, 17, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, - 0, 17, 17, 17, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, - 0, 17, 17, 0, 0, 0, 0, 17, - 17, 0, 0, 17, 17, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 17, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, - 0, 17, 17, 17, 17, 17, 0, 17, - 17, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 17, - 0, 17, 17, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 17, - 17, 0, 0, 0, 0, 0, 17, 17, - 17, 0, 17, 17, 17, 17, 0, 0, - 0, 0, 0, 0, 0, 17, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 17, - 0, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 17, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 17, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 17, 17, 17, 0, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 0, 0, 17, 17, 17, 17, - 17, 17, 17, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 17, - 17, 17, 17, 17, 17, 17, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 0, 0, 17, 17, 17, 17, - 17, 17, 0, 17, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 17, 17, 17, 17, 17, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 17, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 17, - 0, 17, 10, 10, 10, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 0, - 17, 17, 17, 17, 17, 0, 17, 17, - 0, 0, 0, 0, 0, 0, 0, 0, - 17, 17, 17, 17, 17, 17, 17, 17, - 0, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 17, 17, - 17, 0, 17, 0, 0, 0, 17, 17, - 0, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 17, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 17, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 17, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 17, - 17, 17, 17, 17, 17, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 0, - 0, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 17, 17, 17, 18, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 10, 0, 10, - 10, 10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 10, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 10, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 10, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 10, 10, 0, - - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 18, 18, 114, 0, 1, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 9, 7, 11, 14, 16, 12, 15, 9, - 4, 4, 4, 4, 4, 10, 10, 10, - 10, 138, 138, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 138, 138, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 9, - 18, 18, 18, 18, 0, 0, 0, 0, - 0, 0, 18, 18, 18, 18, 18, 18, - 2, 0, 0, 0, 2, 2, 2, 2, - 2, 2, 4, 4, 10, 138, 138, 0, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 4, 4, 10, 138, 138, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 10, 10, 0, 10, 10, 10, 10, 0, - 10, 10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 0, 10, 10, - 10, 0, 0, 0, 0, 0, 10, 10, - 10, 10, 10, 10, 0, 10, 0, 10, - 0, 10, 0, 0, 0, 0, 4, 0, - 0, 0, 10, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 0, 0, 0, - 138, 10, 10, 10, 10, 0, 0, 0, - 0, 0, 10, 10, 0, 0, 0, 0, - 0, 0, 0, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - - 10, 138, 138, 138, 138, 10, 10, 10, - 138, 138, 138, 138, 138, 138, 10, 10, - 10, 138, 4, 4, 10, 138, 138, 10, - 10, 10, 138, 138, 138, 138, 10, 138, - 138, 138, 138, 10, 138, 10, 138, 10, - 10, 10, 10, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 10, 10, 10, 10, - 10, 138, 10, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 10, 10, 10, - 10, 10, 138, 138, 138, 138, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 138, - 138, 10, 138, 10, 138, 138, 138, 138, - 138, 138, 138, 138, 10, 10, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 10, 10, 138, - 138, 138, 138, 10, 10, 10, 10, 10, - 138, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 138, 138, 10, 10, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 10, 10, 10, 10, 10, 138, 138, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 138, 138, 138, 138, 138, 10, 10, - 138, 138, 10, 10, 10, 10, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 10, 10, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - - 10, 10, 10, 10, 10, 10, 10, 10, - 138, 138, 138, 138, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 138, 138, 10, 10, 10, 10, 10, 10, - 10, 138, 138, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 0, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 0, - - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 0, 0, 10, 10, - 0, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 10, 10, 10, 10, 0, 10, 10, - 10, 10, 0, 0, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 0, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 0, 10, 0, 10, - 10, 10, 10, 0, 0, 0, 10, 0, - 10, 10, 10, 10, 10, 10, 10, 0, - 0, 10, 10, 10, 10, 10, 10, 10, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 0, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 138, 138, 138, 138, 10, - 10, 10, 10, 10, 138, 138, 138, 10, - 10, 10, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 10, 10, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 10, 10, 10, 10, 10, 10, 10, 10, - 138, 10, 10, 10, 10, 10, 10, 10, - 138, 138, 138, 138, 138, 138, 10, 10, - 10, 138, 10, 10, 10, 10, 138, 138, - 138, 138, 138, 10, 138, 138, 10, 10, - 138, 138, 138, 138, 138, 10, 10, 10, - 10, 138, 10, 138, 138, 138, 10, 10, - 138, 138, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 138, 138, 138, 138, - 138, 138, 10, 10, 138, 138, 10, 10, - - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 10, 138, 138, - 138, 138, 10, 10, 138, 10, 138, 10, - 10, 138, 10, 138, 138, 138, 138, 10, - 10, 10, 10, 10, 138, 138, 10, 10, - 10, 10, 10, 10, 138, 138, 138, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 138, - 138, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 138, 138, 10, 10, - 10, 10, 138, 138, 138, 138, 10, 138, - 138, 10, 10, 138, 138, 10, 10, 10, - 10, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 10, 10, 138, 138, - 138, 138, 138, 138, 138, 138, 10, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 10, - 10, 10, 10, 10, 138, 10, 138, 10, - 10, 10, 138, 138, 138, 138, 138, 10, - 10, 10, 10, 10, 138, 138, 138, 10, - 10, 10, 10, 138, 10, 10, 10, 138, - 138, 138, 138, 138, 10, 138, 10, 10, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 0, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 0, 0, 0, 0, - - 9, 10, 10, 10, 10, 0, 0, 0, - 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 10, 10, 138, 138, 138, 138, - 138, 138, 138, 138, 10, 10, 10, 10, - 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 17, 17, 17, 17, 17, - 10, 0, 0, 0, 0, 0, 10, 10, - 0, 0, 0, 0, 0, 10, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 17, 10, 10, 0, 0, 0, - 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 17, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 4, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 0, 1, 0, - 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 0, 0, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 0, 0, 0, - - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 17, 17, 17, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 0, - 0, 10, 10, 10, 10, 10, 10, 10, - 6, 10, 6, 0, 10, 6, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 4, - 10, 10, 4, 4, 10, 10, 10, 0, - 10, 4, 4, 10, 0, 0, 0, 0, - 13, 13, 13, 13, 13, 0, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 0, 0, 18, - - 0, 10, 10, 4, 4, 4, 10, 10, - 138, 138, 10, 4, 6, 4, 6, 3, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 6, 10, 138, 10, 138, 10, - 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 138, 10, 138, 10, 10, - 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 138, 10, 138, 10, 138, - 138, 10, 138, 138, 10, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 10, 10, 10, 4, 4, 0, - 10, 10, 10, 10, 10, 10, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 18, 18, 10, 10, 0, 0, -}; - -// 25082 bytes - -const TQ_UINT8 TQUnicodeTables::combining_info[] = { - 1, 1, 1, 2, 3, 4, 5, 6, - 1, 7, 8, 9, 10, 11, 12, 13, - 14, 1, 1, 1, 1, 1, 1, 15, - 16, 1, 1, 1, 1, 1, 1, 1, - 17, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 18, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 19, 1, 1, 20, 1, - - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 232, 220, 220, - 220, 220, 232, 216, 220, 220, 220, 220, - 220, 202, 202, 220, 220, 220, 220, 202, - 202, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 220, 1, 1, 1, 1, - 1, 220, 220, 220, 220, 230, 230, 230, - 230, 230, 230, 230, 230, 240, 230, 220, - 220, 220, 230, 230, 230, 220, 220, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 234, 234, 233, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 230, 230, 230, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 220, 230, 230, 230, 230, 220, 230, - 230, 230, 222, 220, 230, 230, 230, 230, - 230, 230, 0, 220, 220, 220, 220, 220, - 230, 230, 220, 230, 230, 222, 228, 230, - 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 0, 20, 21, 22, 0, 23, - 0, 24, 25, 0, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 28, 29, 30, 31, - 32, 33, 34, 230, 230, 220, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 230, 230, - 230, 230, 230, 230, 230, 0, 0, 230, - 230, 230, 230, 220, 230, 0, 0, 230, - 230, 0, 220, 230, 230, 220, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 230, 220, 230, 230, 220, 230, 230, 220, - 220, 220, 230, 220, 220, 230, 220, 230, - 230, 230, 220, 230, 220, 230, 220, 230, - 220, 230, 230, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 230, 220, 230, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 84, 91, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 103, 103, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 107, 107, 107, 107, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 118, 118, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 122, 122, 122, 122, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 220, 220, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 220, 0, 220, - 0, 216, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 132, 0, 0, 0, - 0, 0, 130, 130, 130, 130, 0, 0, - 130, 0, 230, 230, 9, 0, 230, 230, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 220, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, - 0, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 230, 230, 1, 1, 230, 230, 230, 230, - 1, 1, 1, 230, 230, 0, 0, 0, - 0, 230, 0, 0, 0, 1, 1, 230, - 220, 230, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 218, 228, 232, 222, 224, 224, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 230, 230, 230, 230, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -}; - -// 30458 bytes - -const TQ_UINT16 TQUnicodeTables::case_info[] = { - 1, 2, 3, 4, 5, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 8, - 0, 9, 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 11, - - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, - 0x78, 0x79, 0x7a, 0, 0, 0, 0, 0, - 0, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, - 0x58, 0x59, 0x5a, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0x39c, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0, - 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x178, - - 0x101, 0x100, 0x103, 0x102, 0x105, 0x104, 0x107, 0x106, - 0x109, 0x108, 0x10b, 0x10a, 0x10d, 0x10c, 0x10f, 0x10e, - 0x111, 0x110, 0x113, 0x112, 0x115, 0x114, 0x117, 0x116, - 0x119, 0x118, 0x11b, 0x11a, 0x11d, 0x11c, 0x11f, 0x11e, - 0x121, 0x120, 0x123, 0x122, 0x125, 0x124, 0x127, 0x126, - 0x129, 0x128, 0x12b, 0x12a, 0x12d, 0x12c, 0x12f, 0x12e, - 0x69, 0x49, 0x133, 0x132, 0x135, 0x134, 0x137, 0x136, - 0, 0x13a, 0x139, 0x13c, 0x13b, 0x13e, 0x13d, 0x140, - 0x13f, 0x142, 0x141, 0x144, 0x143, 0x146, 0x145, 0x148, - 0x147, 0, 0x14b, 0x14a, 0x14d, 0x14c, 0x14f, 0x14e, - 0x151, 0x150, 0x153, 0x152, 0x155, 0x154, 0x157, 0x156, - 0x159, 0x158, 0x15b, 0x15a, 0x15d, 0x15c, 0x15f, 0x15e, - 0x161, 0x160, 0x163, 0x162, 0x165, 0x164, 0x167, 0x166, - 0x169, 0x168, 0x16b, 0x16a, 0x16d, 0x16c, 0x16f, 0x16e, - 0x171, 0x170, 0x173, 0x172, 0x175, 0x174, 0x177, 0x176, - 0xff, 0x17a, 0x179, 0x17c, 0x17b, 0x17e, 0x17d, 0x53, - 0, 0x253, 0x183, 0x182, 0x185, 0x184, 0x254, 0x188, - 0x187, 0x256, 0x257, 0x18c, 0x18b, 0, 0x1dd, 0x259, - 0x25b, 0x192, 0x191, 0x260, 0x263, 0x1f6, 0x269, 0x268, - 0x199, 0x198, 0, 0, 0x26f, 0x272, 0x220, 0x275, - 0x1a1, 0x1a0, 0x1a3, 0x1a2, 0x1a5, 0x1a4, 0x280, 0x1a8, - 0x1a7, 0x283, 0, 0, 0x1ad, 0x1ac, 0x288, 0x1b0, - 0x1af, 0x28a, 0x28b, 0x1b4, 0x1b3, 0x1b6, 0x1b5, 0x292, - 0x1b9, 0x1b8, 0, 0, 0x1bd, 0x1bc, 0, 0x1f7, - 0, 0, 0, 0, 0x1c6, 0x1c4, 0x1c4, 0x1c9, - 0x1c7, 0x1c7, 0x1cc, 0x1ca, 0x1ca, 0x1ce, 0x1cd, 0x1d0, - 0x1cf, 0x1d2, 0x1d1, 0x1d4, 0x1d3, 0x1d6, 0x1d5, 0x1d8, - 0x1d7, 0x1da, 0x1d9, 0x1dc, 0x1db, 0x18e, 0x1df, 0x1de, - 0x1e1, 0x1e0, 0x1e3, 0x1e2, 0x1e5, 0x1e4, 0x1e7, 0x1e6, - 0x1e9, 0x1e8, 0x1eb, 0x1ea, 0x1ed, 0x1ec, 0x1ef, 0x1ee, - 0, 0x1f3, 0x1f1, 0x1f1, 0x1f5, 0x1f4, 0x195, 0x1bf, - 0x1f9, 0x1f8, 0x1fb, 0x1fa, 0x1fd, 0x1fc, 0x1ff, 0x1fe, - - 0x201, 0x200, 0x203, 0x202, 0x205, 0x204, 0x207, 0x206, - 0x209, 0x208, 0x20b, 0x20a, 0x20d, 0x20c, 0x20f, 0x20e, - 0x211, 0x210, 0x213, 0x212, 0x215, 0x214, 0x217, 0x216, - 0x219, 0x218, 0x21b, 0x21a, 0x21d, 0x21c, 0x21f, 0x21e, - 0x19e, 0, 0x223, 0x222, 0x225, 0x224, 0x227, 0x226, - 0x229, 0x228, 0x22b, 0x22a, 0x22d, 0x22c, 0x22f, 0x22e, - 0x231, 0x230, 0x233, 0x232, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x181, 0x186, 0, 0x189, 0x18a, - 0, 0x18f, 0, 0x190, 0, 0, 0, 0, - 0x193, 0, 0, 0x194, 0, 0, 0, 0, - 0x197, 0x196, 0, 0, 0, 0, 0, 0x19c, - 0, 0, 0x19d, 0, 0, 0x19f, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0x1a6, 0, 0, 0x1a9, 0, 0, 0, 0, - 0x1ae, 0, 0x1b1, 0x1b2, 0, 0, 0, 0, - 0, 0, 0x1b7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0x399, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0x3ac, 0, - 0x3ad, 0x3ae, 0x3af, 0, 0x3cc, 0, 0x3cd, 0x3ce, - 0, 0x3b1, 0x3b2, 0x3b3, 0x3b4, 0x3b5, 0x3b6, 0x3b7, - 0x3b8, 0x3b9, 0x3ba, 0x3bb, 0x3bc, 0x3bd, 0x3be, 0x3bf, - 0x3c0, 0x3c1, 0, 0x3c3, 0x3c4, 0x3c5, 0x3c6, 0x3c7, - 0x3c8, 0x3c9, 0x3ca, 0x3cb, 0x386, 0x388, 0x389, 0x38a, - 0, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, - 0x398, 0x399, 0x39a, 0x39b, 0x39c, 0x39d, 0x39e, 0x39f, - 0x3a0, 0x3a1, 0x3a3, 0x3a3, 0x3a4, 0x3a5, 0x3a6, 0x3a7, - 0x3a8, 0x3a9, 0x3aa, 0x3ab, 0x38c, 0x38e, 0x38f, 0, - 0x392, 0x398, 0, 0, 0, 0x3a6, 0x3a0, 0, - 0x3d9, 0x3d8, 0x3db, 0x3da, 0x3dd, 0x3dc, 0x3df, 0x3de, - 0x3e1, 0x3e0, 0x3e3, 0x3e2, 0x3e5, 0x3e4, 0x3e7, 0x3e6, - 0x3e9, 0x3e8, 0x3eb, 0x3ea, 0x3ed, 0x3ec, 0x3ef, 0x3ee, - 0x39a, 0x3a1, 0x3a3, 0, 0x3b8, 0x395, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0x450, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, - 0x458, 0x459, 0x45a, 0x45b, 0x45c, 0x45d, 0x45e, 0x45f, - 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, - 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, 0x43f, - 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, - 0x448, 0x449, 0x44a, 0x44b, 0x44c, 0x44d, 0x44e, 0x44f, - 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, - 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, 0x41f, - 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, - 0x428, 0x429, 0x42a, 0x42b, 0x42c, 0x42d, 0x42e, 0x42f, - 0x400, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, - 0x408, 0x409, 0x40a, 0x40b, 0x40c, 0x40d, 0x40e, 0x40f, - 0x461, 0x460, 0x463, 0x462, 0x465, 0x464, 0x467, 0x466, - 0x469, 0x468, 0x46b, 0x46a, 0x46d, 0x46c, 0x46f, 0x46e, - 0x471, 0x470, 0x473, 0x472, 0x475, 0x474, 0x477, 0x476, - 0x479, 0x478, 0x47b, 0x47a, 0x47d, 0x47c, 0x47f, 0x47e, - 0x481, 0x480, 0, 0, 0, 0, 0, 0, - 0, 0, 0x48b, 0x48a, 0x48d, 0x48c, 0x48f, 0x48e, - 0x491, 0x490, 0x493, 0x492, 0x495, 0x494, 0x497, 0x496, - 0x499, 0x498, 0x49b, 0x49a, 0x49d, 0x49c, 0x49f, 0x49e, - 0x4a1, 0x4a0, 0x4a3, 0x4a2, 0x4a5, 0x4a4, 0x4a7, 0x4a6, - 0x4a9, 0x4a8, 0x4ab, 0x4aa, 0x4ad, 0x4ac, 0x4af, 0x4ae, - 0x4b1, 0x4b0, 0x4b3, 0x4b2, 0x4b5, 0x4b4, 0x4b7, 0x4b6, - 0x4b9, 0x4b8, 0x4bb, 0x4ba, 0x4bd, 0x4bc, 0x4bf, 0x4be, - 0, 0x4c2, 0x4c1, 0x4c4, 0x4c3, 0x4c6, 0x4c5, 0x4c8, - 0x4c7, 0x4ca, 0x4c9, 0x4cc, 0x4cb, 0x4ce, 0x4cd, 0, - 0x4d1, 0x4d0, 0x4d3, 0x4d2, 0x4d5, 0x4d4, 0x4d7, 0x4d6, - 0x4d9, 0x4d8, 0x4db, 0x4da, 0x4dd, 0x4dc, 0x4df, 0x4de, - 0x4e1, 0x4e0, 0x4e3, 0x4e2, 0x4e5, 0x4e4, 0x4e7, 0x4e6, - 0x4e9, 0x4e8, 0x4eb, 0x4ea, 0x4ed, 0x4ec, 0x4ef, 0x4ee, - 0x4f1, 0x4f0, 0x4f3, 0x4f2, 0x4f5, 0x4f4, 0, 0, - 0x4f9, 0x4f8, 0, 0, 0, 0, 0, 0, - - 0x501, 0x500, 0x503, 0x502, 0x505, 0x504, 0x507, 0x506, - 0x509, 0x508, 0x50b, 0x50a, 0x50d, 0x50c, 0x50f, 0x50e, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x561, 0x562, 0x563, 0x564, 0x565, 0x566, 0x567, - 0x568, 0x569, 0x56a, 0x56b, 0x56c, 0x56d, 0x56e, 0x56f, - 0x570, 0x571, 0x572, 0x573, 0x574, 0x575, 0x576, 0x577, - 0x578, 0x579, 0x57a, 0x57b, 0x57c, 0x57d, 0x57e, 0x57f, - 0x580, 0x581, 0x582, 0x583, 0x584, 0x585, 0x586, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x531, 0x532, 0x533, 0x534, 0x535, 0x536, 0x537, - 0x538, 0x539, 0x53a, 0x53b, 0x53c, 0x53d, 0x53e, 0x53f, - 0x540, 0x541, 0x542, 0x543, 0x544, 0x545, 0x546, 0x547, - 0x548, 0x549, 0x54a, 0x54b, 0x54c, 0x54d, 0x54e, 0x54f, - 0x550, 0x551, 0x552, 0x553, 0x554, 0x555, 0x556, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0x1e01, 0x1e00, 0x1e03, 0x1e02, 0x1e05, 0x1e04, 0x1e07, 0x1e06, - 0x1e09, 0x1e08, 0x1e0b, 0x1e0a, 0x1e0d, 0x1e0c, 0x1e0f, 0x1e0e, - 0x1e11, 0x1e10, 0x1e13, 0x1e12, 0x1e15, 0x1e14, 0x1e17, 0x1e16, - 0x1e19, 0x1e18, 0x1e1b, 0x1e1a, 0x1e1d, 0x1e1c, 0x1e1f, 0x1e1e, - 0x1e21, 0x1e20, 0x1e23, 0x1e22, 0x1e25, 0x1e24, 0x1e27, 0x1e26, - 0x1e29, 0x1e28, 0x1e2b, 0x1e2a, 0x1e2d, 0x1e2c, 0x1e2f, 0x1e2e, - 0x1e31, 0x1e30, 0x1e33, 0x1e32, 0x1e35, 0x1e34, 0x1e37, 0x1e36, - 0x1e39, 0x1e38, 0x1e3b, 0x1e3a, 0x1e3d, 0x1e3c, 0x1e3f, 0x1e3e, - 0x1e41, 0x1e40, 0x1e43, 0x1e42, 0x1e45, 0x1e44, 0x1e47, 0x1e46, - 0x1e49, 0x1e48, 0x1e4b, 0x1e4a, 0x1e4d, 0x1e4c, 0x1e4f, 0x1e4e, - 0x1e51, 0x1e50, 0x1e53, 0x1e52, 0x1e55, 0x1e54, 0x1e57, 0x1e56, - 0x1e59, 0x1e58, 0x1e5b, 0x1e5a, 0x1e5d, 0x1e5c, 0x1e5f, 0x1e5e, - 0x1e61, 0x1e60, 0x1e63, 0x1e62, 0x1e65, 0x1e64, 0x1e67, 0x1e66, - 0x1e69, 0x1e68, 0x1e6b, 0x1e6a, 0x1e6d, 0x1e6c, 0x1e6f, 0x1e6e, - 0x1e71, 0x1e70, 0x1e73, 0x1e72, 0x1e75, 0x1e74, 0x1e77, 0x1e76, - 0x1e79, 0x1e78, 0x1e7b, 0x1e7a, 0x1e7d, 0x1e7c, 0x1e7f, 0x1e7e, - 0x1e81, 0x1e80, 0x1e83, 0x1e82, 0x1e85, 0x1e84, 0x1e87, 0x1e86, - 0x1e89, 0x1e88, 0x1e8b, 0x1e8a, 0x1e8d, 0x1e8c, 0x1e8f, 0x1e8e, - 0x1e91, 0x1e90, 0x1e93, 0x1e92, 0x1e95, 0x1e94, 0, 0, - 0, 0, 0, 0x1e60, 0, 0, 0, 0, - 0x1ea1, 0x1ea0, 0x1ea3, 0x1ea2, 0x1ea5, 0x1ea4, 0x1ea7, 0x1ea6, - 0x1ea9, 0x1ea8, 0x1eab, 0x1eaa, 0x1ead, 0x1eac, 0x1eaf, 0x1eae, - 0x1eb1, 0x1eb0, 0x1eb3, 0x1eb2, 0x1eb5, 0x1eb4, 0x1eb7, 0x1eb6, - 0x1eb9, 0x1eb8, 0x1ebb, 0x1eba, 0x1ebd, 0x1ebc, 0x1ebf, 0x1ebe, - 0x1ec1, 0x1ec0, 0x1ec3, 0x1ec2, 0x1ec5, 0x1ec4, 0x1ec7, 0x1ec6, - 0x1ec9, 0x1ec8, 0x1ecb, 0x1eca, 0x1ecd, 0x1ecc, 0x1ecf, 0x1ece, - 0x1ed1, 0x1ed0, 0x1ed3, 0x1ed2, 0x1ed5, 0x1ed4, 0x1ed7, 0x1ed6, - 0x1ed9, 0x1ed8, 0x1edb, 0x1eda, 0x1edd, 0x1edc, 0x1edf, 0x1ede, - 0x1ee1, 0x1ee0, 0x1ee3, 0x1ee2, 0x1ee5, 0x1ee4, 0x1ee7, 0x1ee6, - 0x1ee9, 0x1ee8, 0x1eeb, 0x1eea, 0x1eed, 0x1eec, 0x1eef, 0x1eee, - 0x1ef1, 0x1ef0, 0x1ef3, 0x1ef2, 0x1ef5, 0x1ef4, 0x1ef7, 0x1ef6, - 0x1ef9, 0x1ef8, 0, 0, 0, 0, 0, 0, - - 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, - 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, - 0x1f18, 0x1f19, 0x1f1a, 0x1f1b, 0x1f1c, 0x1f1d, 0, 0, - 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0, 0, - 0x1f28, 0x1f29, 0x1f2a, 0x1f2b, 0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f, - 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, - 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, 0x1f3c, 0x1f3d, 0x1f3e, 0x1f3f, - 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, - 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, 0x1f4c, 0x1f4d, 0, 0, - 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0, 0, - 0, 0x1f59, 0, 0x1f5b, 0, 0x1f5d, 0, 0x1f5f, - 0, 0x1f51, 0, 0x1f53, 0, 0x1f55, 0, 0x1f57, - 0x1f68, 0x1f69, 0x1f6a, 0x1f6b, 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, - 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, - 0x1fba, 0x1fbb, 0x1fc8, 0x1fc9, 0x1fca, 0x1fcb, 0x1fda, 0x1fdb, - 0x1ff8, 0x1ff9, 0x1fea, 0x1feb, 0x1ffa, 0x1ffb, 0, 0, - 0x1f88, 0x1f89, 0x1f8a, 0x1f8b, 0x1f8c, 0x1f8d, 0x1f8e, 0x1f8f, - 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87, - 0x1f98, 0x1f99, 0x1f9a, 0x1f9b, 0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f, - 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97, - 0x1fa8, 0x1fa9, 0x1faa, 0x1fab, 0x1fac, 0x1fad, 0x1fae, 0x1faf, - 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7, - 0x1fb8, 0x1fb9, 0, 0x1fbc, 0, 0, 0, 0, - 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x1fb3, 0, 0x399, 0, - 0, 0, 0, 0x1fcc, 0, 0, 0, 0, - 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1fc3, 0, 0, 0, - 0x1fd8, 0x1fd9, 0, 0, 0, 0, 0, 0, - 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0, 0, 0, 0, - 0x1fe8, 0x1fe9, 0, 0, 0, 0x1fec, 0, 0, - 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0, 0, 0, - 0, 0, 0, 0x1ffc, 0, 0, 0, 0, - 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x1ff3, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0x3c9, 0, - 0, 0, 0x6b, 0xe5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, - 0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, - 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, - 0x2168, 0x2169, 0x216a, 0x216b, 0x216c, 0x216d, 0x216e, 0x216f, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0x24d0, 0x24d1, - 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, - 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, - 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, - 0x24b6, 0x24b7, 0x24b8, 0x24b9, 0x24ba, 0x24bb, 0x24bc, 0x24bd, - 0x24be, 0x24bf, 0x24c0, 0x24c1, 0x24c2, 0x24c3, 0x24c4, 0x24c5, - 0x24c6, 0x24c7, 0x24c8, 0x24c9, 0x24ca, 0x24cb, 0x24cc, 0x24cd, - 0x24ce, 0x24cf, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, - 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, - 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, - 0xff58, 0xff59, 0xff5a, 0, 0, 0, 0, 0, - 0, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, - 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, - 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, - 0xff38, 0xff39, 0xff3a, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -}; -// 36602 bytes - -const TQ_INT8 TQUnicodeTables::decimal_info[] = { - 1, 0, 0, 0, 0, 0, 2, 0, - 0, 3, 3, 4, 3, 5, 6, 7, - 8, 0, 0, 9, 0, 0, 0, 10, - 11, 0, 0, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 13, 0, 0, 14, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 11, - - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2, 3, -1, -1, -1, -1, - -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1, - 2, 3, 4, 5, 6, 7, 8, 9, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 1, 2, 3, 4, 5, 6, 7, 8, - 9, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1, 2, 3, 4, - 5, 6, 7, 8, 9, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 1, 2, 3, 4, 5, 6, 7, 8, - 9, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1, 2, 3, - 4, 5, 6, 7, 8, 9, -1, -1, - - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1, 2, - 3, 4, 5, 6, 7, 8, 9, -1, - 1, 2, 3, 4, 5, 6, 7, 8, - 9, -1, 1, 2, 3, 4, 5, 6, - 7, 8, 9, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -}; -// 40698 bytes - -#endif - -#ifdef TQT_NO_UNICODETABLES - -const TQ_UINT8 TQUnicodeTables::latin1_line_break_info[] = { - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 15, 23, 19, 21, 22, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 26, 5, 2, 11, 8, 9, 11, 2, - 0, 1, 11, 8, 7, 14, 7, 6, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 7, 7, 11, 11, 11, 5, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 0, 8, 1, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 0, 15, 1, 11, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 3, 11, 9, 8, 8, 8, 11, 11, - 11, 11, 11, 2, 11, 15, 11, 11, - 9, 8, 11, 11, 16, 11, 11, 11, - 11, 11, 11, 2, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, -}; - -#else - -const TQ_UINT8 TQUnicodeTables::line_break_info[] = { - 1, 2, 3, 4, 5, 6, 7, 8, - 2, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 2, 18, 2, 2, 19, 20, - 21, 2, 2, 2, 2, 2, 2, 2, - 22, 23, 24, 25, 2, 2, 2, 26, - 2, 27, 2, 2, 2, 2, 28, 29, - 30, 31, 32, 33, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 35, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 36, - 34, 34, 34, 34, 37, 2, 2, 2, - 2, 2, 2, 2, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 38, - 39, 39, 39, 39, 39, 39, 39, 39, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 34, 40, 41, 2, 42, 43, 44, - - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 15, 23, 19, 21, 22, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 26, 5, 2, 11, 8, 9, 11, 2, - 0, 1, 11, 8, 7, 14, 7, 6, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 7, 7, 11, 11, 11, 5, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 0, 8, 1, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 0, 15, 1, 11, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 3, 11, 9, 8, 8, 8, 11, 11, - 11, 11, 11, 2, 11, 15, 11, 11, - 9, 8, 11, 11, 16, 11, 11, 11, - 11, 11, 11, 2, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 16, 11, 11, 11, 16, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 19, 19, 19, 19, 11, - 19, 19, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 7, 15, 11, 11, 11, 11, 11, - 11, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 11, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 11, 19, 19, 19, 11, 19, - 11, 19, 19, 11, 19, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 11, 11, 11, 11, 11, 11, - 19, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 11, 11, 19, - 19, 11, 19, 19, 19, 19, 11, 11, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 19, - 11, 19, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 19, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 19, 11, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 11, 11, - 11, 19, 19, 19, 19, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 19, 11, 11, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 19, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 19, 11, 19, 19, - 19, 19, 19, 19, 19, 11, 11, 19, - 19, 11, 11, 19, 19, 19, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 19, 11, 11, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 8, 8, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 19, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 19, 11, 19, 19, - 19, 19, 19, 11, 11, 11, 11, 19, - 19, 11, 11, 19, 19, 19, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 19, 19, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 19, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 19, 11, 19, 19, - 19, 19, 19, 19, 19, 19, 11, 19, - 19, 19, 11, 19, 19, 19, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 19, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 19, 11, 19, 19, - 19, 19, 19, 19, 11, 11, 11, 19, - 19, 11, 11, 19, 19, 19, 11, 11, - 11, 11, 11, 11, 11, 11, 19, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 19, 19, - 19, 19, 19, 11, 11, 11, 19, 19, - 19, 11, 19, 19, 19, 19, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 19, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 19, 19, - 19, 19, 19, 19, 19, 11, 19, 19, - 19, 11, 19, 19, 19, 19, 11, 11, - 11, 11, 11, 11, 11, 19, 19, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 19, 19, - 19, 19, 19, 19, 19, 11, 19, 19, - 19, 11, 19, 19, 19, 19, 11, 11, - 11, 11, 11, 11, 11, 19, 19, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 19, 19, - 19, 19, 19, 19, 11, 11, 19, 19, - 19, 11, 19, 19, 19, 19, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 11, 11, 11, 11, 19, - 19, 19, 19, 19, 19, 11, 19, 11, - 19, 19, 19, 19, 19, 19, 19, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 19, 20, 20, 19, 19, 19, 19, - 19, 19, 19, 11, 11, 11, 11, 8, - 20, 20, 20, 20, 20, 20, 20, 19, - 19, 19, 19, 19, 19, 19, 19, 11, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 4, 4, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 20, 20, 11, 20, 11, 11, 20, - 20, 11, 20, 11, 11, 20, 11, 11, - 11, 11, 11, 11, 20, 20, 20, 20, - 11, 20, 20, 20, 20, 20, 20, 20, - 11, 20, 20, 20, 11, 20, 11, 20, - 11, 11, 20, 20, 11, 20, 20, 20, - 20, 19, 20, 20, 19, 19, 19, 19, - 19, 19, 11, 19, 19, 20, 11, 11, - 20, 20, 20, 20, 20, 11, 20, 11, - 19, 19, 19, 19, 19, 19, 11, 11, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 11, 11, 20, 20, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 15, 3, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 19, 19, 11, 11, 11, 11, 11, 11, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 19, 11, 19, - 11, 19, 0, 1, 0, 1, 19, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 11, 19, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 19, 19, 19, 19, 19, 19, 19, 19, - 11, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 19, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 11, 20, 20, 20, 20, 20, - 11, 20, 20, 11, 19, 19, 19, 19, - 19, 19, 19, 11, 11, 11, 19, 19, - 19, 19, 11, 11, 11, 11, 11, 11, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 11, 11, 11, 11, 11, 11, - 20, 20, 20, 20, 20, 20, 19, 19, - 19, 19, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 11, 11, 11, 11, 11, 12, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 11, 11, 11, 11, 11, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 15, 11, 11, 11, 11, 11, 11, - 11, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 15, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 0, 1, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 19, 19, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 19, 19, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 4, 15, 4, 4, - 4, 4, 4, 8, 11, 11, 11, 11, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 16, 11, - 11, 11, 11, 19, 19, 19, 19, 11, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 19, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 15, 15, 15, 15, 15, 15, 15, 3, - 15, 15, 15, 18, 19, 19, 19, 19, - 15, 3, 15, 15, 17, 11, 11, 11, - 2, 2, 0, 2, 2, 2, 0, 2, - 11, 11, 11, 11, 13, 13, 13, 15, - 21, 21, 19, 19, 19, 19, 19, 3, - 9, 9, 9, 9, 9, 9, 9, 9, - 11, 2, 2, 11, 4, 11, 11, 11, - 11, 11, 11, 11, 4, 0, 1, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 15, - 3, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 19, 19, 19, 19, 19, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 0, 1, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 0, 1, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 8, 8, 8, 8, 8, 8, 8, 9, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 9, 11, 11, 11, 11, - 11, 9, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 8, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 9, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 8, 8, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 0, 1, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 0, 1, 2, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 2, 2, 2, 2, 11, - 11, 11, 5, 5, 11, 11, 11, 11, - 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 0, 1, - 0, 1, 0, 1, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 0, 1, 0, - 1, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 0, 1, 0, 1, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 0, 1, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 11, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 11, 11, 11, 11, - - 12, 1, 1, 12, 12, 4, 12, 12, - 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 12, 12, 0, 1, 0, 1, - 0, 1, 0, 1, 4, 0, 1, 1, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 19, 19, 19, 19, 19, 19, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 4, 4, 12, 12, 12, - 11, 4, 12, 4, 12, 4, 12, 4, - 12, 4, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 4, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 4, 12, 4, 12, 4, - 12, 12, 12, 12, 12, 12, 4, 12, - 12, 12, 12, 12, 12, 4, 4, 11, - 11, 19, 19, 4, 4, 4, 4, 12, - 4, 4, 12, 4, 12, 4, 12, 4, - 12, 4, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 4, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 4, 12, 4, 12, 4, - 12, 12, 12, 12, 12, 12, 4, 12, - 12, 12, 12, 12, 12, 4, 4, 12, - 12, 12, 12, 4, 4, 4, 12, 12, - - 11, 11, 11, 11, 11, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 11, 11, 11, - 11, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 11, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 11, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 11, 11, 11, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 11, 11, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 11, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 11, - 11, 11, 11, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 11, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 11, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, - - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 19, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 0, 1, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 9, 11, 11, 11, - - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 19, 19, 19, 19, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 12, 12, 12, 12, 12, 0, 1, 0, - 1, 0, 1, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 12, 12, 11, - 11, 12, 12, 12, 12, 12, 12, 12, - 1, 12, 1, 11, 4, 4, 5, 5, - 12, 0, 1, 0, 1, 0, 1, 12, - 12, 12, 12, 12, 12, 12, 12, 11, - 12, 8, 9, 12, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 3, - - 11, 5, 12, 12, 8, 9, 12, 12, - 0, 1, 12, 12, 1, 12, 1, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 4, 4, 12, 12, 12, 5, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 0, 12, 1, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 0, 12, 1, 12, 0, - 1, 1, 0, 1, 1, 4, 11, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 4, 4, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 9, 8, 12, 12, 12, 8, 8, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 19, 19, 19, 25, 11, 11, 11, -}; -// 52474 bytes - -// END OF GENERATED DATA -#endif - - - -#ifndef TQT_NO_UNICODETABLES -const TQ_UINT16 TQUnicodeTables::symmetricPairs[] = { - 0x0028, 0x0029, 0x003C, 0x003E, 0x005B, 0x005D, 0x007B, 0x007D, - 0x00AB, 0x00BB, 0x2039, 0x203A, 0x2045, 0x2046, 0x207D, 0x207E, - 0x208D, 0x208E, 0x2208, 0x220B, 0x2209, 0x220C, 0x220A, 0x220D, - 0x2215, 0x29F5, 0x223C, 0x223D, 0x2243, 0x22CD, 0x2252, 0x2253, - 0x2254, 0x2255, 0x2264, 0x2265, 0x2266, 0x2267, 0x2268, 0x2269, - 0x226A, 0x226B, 0x226E, 0x226F, 0x2270, 0x2271, 0x2272, 0x2273, - 0x2274, 0x2275, 0x2276, 0x2277, 0x2278, 0x2279, 0x227A, 0x227B, - 0x227C, 0x227D, 0x227E, 0x227F, 0x2280, 0x2281, 0x2282, 0x2283, - 0x2284, 0x2285, 0x2286, 0x2287, 0x2288, 0x2289, 0x228A, 0x228B, - 0x228F, 0x2290, 0x2291, 0x2292, 0x2298, 0x29B8, 0x22A2, 0x22A3, - 0x22A6, 0x2ADE, 0x22A8, 0x2AE4, 0x22A9, 0x2AE3, 0x22AB, 0x2AE5, - 0x22B0, 0x22B1, 0x22B2, 0x22B3, 0x22B4, 0x22B5, 0x22B6, 0x22B7, - 0x22C9, 0x22CA, 0x22CB, 0x22CC, 0x22D0, 0x22D1, 0x22D6, 0x22D7, - 0x22D8, 0x22D9, 0x22DA, 0x22DB, 0x22DC, 0x22DD, 0x22DE, 0x22DF, - 0x22E0, 0x22E1, 0x22E2, 0x22E3, 0x22E4, 0x22E5, 0x22E6, 0x22E7, - 0x22E8, 0x22E9, 0x22EA, 0x22EB, 0x22EC, 0x22ED, 0x22F0, 0x22F1, - 0x22F2, 0x22FA, 0x22F3, 0x22FB, 0x22F4, 0x22FC, 0x22F6, 0x22FD, - 0x22F7, 0x22FE, 0x2308, 0x2309, 0x230A, 0x230B, 0x2329, 0x232A, - 0x2768, 0x2769, 0x276A, 0x276B, 0x276C, 0x276D, 0x276E, 0x276F, - 0x2770, 0x2771, 0x2772, 0x2773, 0x2774, 0x2775, 0x27D5, 0x27D6, - 0x27DD, 0x27DE, 0x27E2, 0x27E3, 0x27E4, 0x27E5, 0x27E6, 0x27E7, - 0x27E8, 0x27E9, 0x27EA, 0x27EB, 0x2983, 0x2984, 0x2985, 0x2986, - 0x2987, 0x2988, 0x2989, 0x298A, 0x298B, 0x298C, 0x298D, 0x2990, - 0x298E, 0x298F, 0x2991, 0x2992, 0x2993, 0x2994, 0x2995, 0x2996, - 0x2997, 0x2998, 0x29C0, 0x29C1, 0x29C4, 0x29C5, 0x29CF, 0x29D0, - 0x29D1, 0x29D2, 0x29D4, 0x29D5, 0x29D8, 0x29D9, 0x29DA, 0x29DB, - 0x29F8, 0x29F9, 0x29FC, 0x29FD, 0x2A2B, 0x2A2C, 0x2A34, 0x2A35, - 0x2A3C, 0x2A3D, 0x2A64, 0x2A65, 0x2A79, 0x2A7A, 0x2A7D, 0x2A7E, - 0x2A7F, 0x2A80, 0x2A81, 0x2A82, 0x2A83, 0x2A84, 0x2A8B, 0x2A8C, - 0x2A91, 0x2A92, 0x2A93, 0x2A94, 0x2A95, 0x2A96, 0x2A97, 0x2A98, - 0x2A99, 0x2A9A, 0x2A9B, 0x2A9C, 0x2AA1, 0x2AA2, 0x2AA6, 0x2AA7, - 0x2AA8, 0x2AA9, 0x2AAA, 0x2AAB, 0x2AAC, 0x2AAD, 0x2AAF, 0x2AB0, - 0x2AB3, 0x2AB4, 0x2ABB, 0x2ABC, 0x2ABD, 0x2ABE, 0x2ABF, 0x2AC0, - 0x2AC1, 0x2AC2, 0x2AC3, 0x2AC4, 0x2AC5, 0x2AC6, 0x2ACD, 0x2ACE, - 0x2ACF, 0x2AD0, 0x2AD1, 0x2AD2, 0x2AD3, 0x2AD4, 0x2AD5, 0x2AD6, - 0x2AEC, 0x2AED, 0x2AF7, 0x2AF8, 0x2AF9, 0x2AFA, 0x3008, 0x3009, - 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, - 0x3014, 0x3015, 0x3016, 0x3017, 0x3018, 0x3019, 0x301A, 0x301B, - 0xFF08, 0xFF09, 0xFF1C, 0xFF1E, 0xFF3B, 0xFF3D, 0xFF5B, 0xFF5D, - 0xFF5F, 0xFF60, 0xFF62, 0xFF63, -}; - -// ### shouldn't this be const? -const int TQUnicodeTables::symmetricPairsSize = - sizeof(symmetricPairs)/sizeof(symmetricPairs[0]); - -#else - -/* - only include info for the first tqunicode range (latin1) when building - without tqunicode tables. -*/ -const TQ_UINT8 TQUnicodeTables::tqunicode_info[] = { - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 7, 26, 26, 26, 28, 26, 26, 26, - 22, 23, 26, 27, 26, 21, 26, 26, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 26, 26, 27, 27, 27, 26, - 26, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 22, 26, 23, 29, 20, - 29, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 22, 27, 23, 27, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 7, 26, 28, 28, 28, 28, 30, 30, - 29, 30, 16, 24, 27, 21, 30, 29, - 30, 27, 6, 6, 29, 16, 30, 26, - 29, 6, 16, 25, 6, 6, 6, 26, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 27, - 15, 15, 15, 15, 15, 15, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 27, - 16, 16, 16, 16, 16, 16, 16, 16 -}; - -#endif - -/* - * ---------------------------------------------------------------------- - * End of tqunicode tables - * ---------------------------------------------------------------------- - */ - -enum Script { - // European Alphabetic Scripts - Latin, - Greek, - Cyrillic, - Armenian, - Georgian, - Runic, - Ogham, - SpacingModifiers, - CombiningMarks, - - // Middle Eastern Scripts - Hebrew, - Arabic, - Syriac, - Thaana, - - // South and Southeast Asian Scripts - Devanagari, - Bengali, - Gurmukhi, - Gujarati, - Oriya, - Tamil, - Telugu, - Kannada, - Malayalam, - Sinhala, - Thai, - Lao, - Tibetan, - Myanmar, - Khmer, - - // East Asian Scripts - Han, - Hiragana, - Katakana, - Hangul, - Bopomofo, - Yi, - - // Additional Scripts - Ethiopic, - Cherokee, - CanadianAboriginal, - Mongolian, - - // Symbols - CurrencySymbols, - LetterlikeSymbols, - NumberForms, - MathematicalOperators, - TechnicalSymbols, - GeometricSymbols, - MiscellaneousSymbols, - EnclosedAndSquare, - Braille, - - Unicode, - - // some scripts added in Unicode 3.2 - Tagalog, - Hanunoo, - Buhid, - Tagbanwa, - - KatakanaHalfWidth, // from JIS X 0201 - - // from Unicode 4.0 - Limbu, - TaiLe, - - // End - NScripts, - UnknownScript = NScripts -}; - -// copied form tqfont.h, as we can't include it in tools. Do not modify without -// changing the script enum in tqfont.h aswell. -const unsigned char TQUnicodeTables::otherScripts [128] = { -#define SCRIPTS_02 0 - 0xaf, Latin, 0xff, SpacingModifiers, // row 0x02, index 0 -#define SCRIPTS_03 4 - 0x6f, CombiningMarks, 0xff, Greek, // row 0x03, index 4 -#define SCRIPTS_05 8 - 0x2f, Cyrillic, 0x8f, Armenian, 0xff, Hebrew, // row 0x05, index 8 -#define SCRIPTS_07 14 - 0x4f, Syriac, 0x7f, Unicode, 0xbf, Thaana, - 0xff, Unicode, // row 0x07, index 14 -#define SCRIPTS_10 22 - 0x9f, Myanmar, 0xff, Georgian, // row 0x10, index 20 -#define SCRIPTS_13 26 - 0x7f, Ethiopic, 0x9f, Unicode, 0xff, Cherokee, // row 0x13, index 24 -#define SCRIPTS_16 32 - 0x7f, CanadianAboriginal, 0x9f, Ogham, - 0xff, Runic, // row 0x16 index 30 -#define SCRIPTS_17 38 - 0x1f, Tagalog, 0x3f, Hanunoo, 0x5f, Buhid, - 0x7f, Tagbanwa, 0xff, Khmer, // row 0x17, index 36 -#define SCRIPTS_18 48 - 0xaf, Mongolian, 0xff, Unicode, // row 0x18, index 46 -#define SCRIPTS_19 52 - 0x4f, Limbu, 0x7f, TaiLe, 0xdf, Unicode, 0xff, Khmer, -#define SCRIPTS_20 60 - 0x0a, Unicode, 0x0d, UnknownScript, 0x6f, Unicode, 0x9f, NumberForms, - 0xab, CurrencySymbols, 0xac, Latin, - 0xcf, CurrencySymbols, 0xff, CombiningMarks, // row 0x20, index 50 -#define SCRIPTS_21 76 - 0x4f, LetterlikeSymbols, 0x8f, NumberForms, - 0xff, MathematicalOperators, // row 0x21, index 62 -#define SCRIPTS_24 82 - 0x5f, TechnicalSymbols, 0xff, EnclosedAndSquare, // row 0x24, index 68 -#define SCRIPTS_2e 86 - 0x7f, Unicode, 0xff, Han, // row 0x2e, index 72 -#define SCRIPTS_30 90 - 0x3f, Han, 0x9f, Hiragana, 0xff, Katakana, // row 0x30, index 76 -#define SCRIPTS_31 96 - 0x2f, Bopomofo, 0x8f, Hangul, 0x9f, Han, - 0xff, Unicode, // row 0x31, index 82 -#define SCRIPTS_fb 104 - 0x06, Latin, 0x1c, Unicode, 0x4f, Hebrew, - 0xff, Arabic, // row 0xfb, index 90 -#define SCRIPTS_fe 112 - 0x1f, Unicode, 0x2f, CombiningMarks, 0x6f, Han, - 0xff, Arabic, // row 0xfe, index 98 -#define SCRIPTS_ff 120 - 0x60, Han, // row 0xff, index 106 - 0x9f, KatakanaHalfWidth, 0xef, Han, 0xff, Unicode -}; - -// (uc-0x0900)>>7 -const unsigned char TQUnicodeTables::indicScripts [] = -{ - Devanagari, Bengali, - Gurmukhi, Gujarati, - Oriya, Tamil, - Telugu, Kannada, - Malayalam, Sinhala, - Thai, Lao -}; - - -// 0x80 + x: x is the offset into the otherScripts table -const unsigned char TQUnicodeTables::scriptTable[256] = -{ - Latin, Latin, 0x80+SCRIPTS_02, 0x80+SCRIPTS_03, - Cyrillic, 0x80+SCRIPTS_05, Arabic, 0x80+SCRIPTS_07, - Unicode, SCRIPTS_INDIC, SCRIPTS_INDIC, SCRIPTS_INDIC, - SCRIPTS_INDIC, SCRIPTS_INDIC, SCRIPTS_INDIC, Tibetan, - - 0x80+SCRIPTS_10, Hangul, Ethiopic, 0x80+SCRIPTS_13, - CanadianAboriginal, CanadianAboriginal, 0x80+SCRIPTS_16, 0x80+SCRIPTS_17, - 0x80+SCRIPTS_18, 0x80+SCRIPTS_19, Unicode, Unicode, - Unicode, Unicode, Latin, Greek, - - 0x80+SCRIPTS_20, 0x80+SCRIPTS_21, MathematicalOperators, TechnicalSymbols, - 0x80+SCRIPTS_24, GeometricSymbols, MiscellaneousSymbols, MiscellaneousSymbols, - Braille, Unicode, Unicode, Unicode, - Unicode, Unicode, 0x80+SCRIPTS_2e, Han, - - 0x80+SCRIPTS_30, 0x80+SCRIPTS_31, EnclosedAndSquare, EnclosedAndSquare, - Han, Han, Han, Han, - Han, Han, Han, Han, - Han, Han, Han, Han, - - Han, Han, Han, Han, Han, Han, Han, Han, - Han, Han, Han, Han, Han, Han, Han, Han, - - Han, Han, Han, Han, Han, Han, Han, Han, - Han, Han, Han, Han, Han, Han, Han, Han, - - Han, Han, Han, Han, Han, Han, Han, Han, - Han, Han, Han, Han, Han, Han, Han, Han, - - Han, Han, Han, Han, Han, Han, Han, Han, - Han, Han, Han, Han, Han, Han, Han, Han, - - - Han, Han, Han, Han, Han, Han, Han, Han, - Han, Han, Han, Han, Han, Han, Han, Han, - - Han, Han, Han, Han, Han, Han, Han, Han, - Han, Han, Han, Han, Han, Han, Han, Han, - - Yi, Yi, Yi, Yi, Yi, Unicode, Unicode, Unicode, - Unicode, Unicode, Unicode, Unicode, Hangul, Hangul, Hangul, Hangul, - - Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, - Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, - - Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, - Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, - - Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, - Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, - - Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, - Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, - - Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, - Unicode, Han, Han, 0x80+SCRIPTS_fb, Arabic, Arabic, 0x80+SCRIPTS_fe, 0x80+SCRIPTS_ff -}; - diff --git a/tqtinterface/qt4/src/tools/tqunicodetables_p.h b/tqtinterface/qt4/src/tools/tqunicodetables_p.h deleted file mode 100644 index 4afa5d1..0000000 --- a/tqtinterface/qt4/src/tools/tqunicodetables_p.h +++ /dev/null @@ -1,266 +0,0 @@ -/**************************************************************************** -** -** ??? -** -** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the widgets module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQUNICODETABLES_P_H -#define TQUNICODETABLES_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the TQt API. It exists for the convenience -// of internal files. This header file may change from version to version -// without notice, or even be removed. -// -// We mean it. -// -// - -#ifndef TQT_H -#include "tqstring.h" -#endif // TQT_H - -#ifdef TQT_NO_UNICODETABLES -# include <ctype.h> -#endif - -class TQUnicodeTables { -public: - static const TQ_UINT8 tqunicode_info[]; -#ifndef TQT_NO_UNICODETABLES - static const TQ_UINT16 decomposition_map[]; - static const TQ_UINT16 decomposition_info[]; - static const TQ_UINT16 ligature_map[]; - static const TQ_UINT16 ligature_info[]; - static const TQ_UINT8 direction_info[]; - static const TQ_UINT8 combining_info[]; - static const TQ_UINT16 case_info[]; - static const TQ_INT8 decimal_info[]; - static const TQ_UINT16 symmetricPairs[]; - static const int symmetricPairsSize; - static const TQ_UINT8 line_break_info[]; -#else - static const TQ_UINT8 latin1_line_break_info[]; -#endif - static const unsigned char otherScripts[]; - static const unsigned char indicScripts[]; - static const unsigned char scriptTable[]; - enum { SCRIPTS_INDIC = 0x7e }; - - // see http://www.tqunicode.org/reports/tr14/tr14-13.html - // we don't use the XX and AI properties and map them to AL instead. - enum LineBreakClass { - LineBreak_OP, LineBreak_CL, LineBreak_QU, LineBreak_GL, LineBreak_NS, - LineBreak_EX, LineBreak_SY, LineBreak_IS, LineBreak_PR, LineBreak_PO, - LineBreak_NU, LineBreak_AL, LineBreak_ID, LineBreak_IN, LineBreak_HY, - LineBreak_BA, LineBreak_BB, LineBreak_B2, LineBreak_ZW, LineBreak_CM, - LineBreak_SA, LineBreak_BK, LineBreak_CR, LineBreak_LF, LineBreak_SG, - LineBreak_CB, LineBreak_SP - }; -}; - - -inline TQChar::Category category( const TQChar &c ) -{ -#ifdef TQT_NO_UNICODETABLES - if ( c.tqunicode() > 0xff ) return TQChar::Letter_Uppercase; //######## - return (TQChar::Category)TQUnicodeTables::tqunicode_info[c.tqunicode()]; -#else - register int uc = ((int)TQUnicodeTables::tqunicode_info[c.row()]) << 8; - uc += c.cell(); - return (TQChar::Category)TQUnicodeTables::tqunicode_info[uc]; -#endif // TQT_NO_UNICODETABLES -} - -inline TQChar lower( const TQChar &c ) -{ -#ifndef TQT_NO_UNICODETABLES - int row = c.row(); - int cell = c.cell(); - register int ci = TQUnicodeTables::case_info[row]; - register int uc = ((int)TQUnicodeTables::tqunicode_info[c.row()]) << 8; - uc += c.cell(); - if (TQUnicodeTables::tqunicode_info[uc] != TQChar::Letter_Uppercase || !ci) - return c; - TQ_UINT16 lower = TQUnicodeTables::case_info[(ci<<8)+cell]; - return lower ? TQChar(lower) : c; -#else - if ( c.row() ) - return c; - return TQChar( tolower((uchar) c.latin1()) ); -#endif -} - -inline TQChar upper( const TQChar &c ) -{ -#ifndef TQT_NO_UNICODETABLES - int row = c.row(); - int cell = c.cell(); - register int ci = TQUnicodeTables::case_info[row]; - register int uc = ((int)TQUnicodeTables::tqunicode_info[c.row()]) << 8; - uc += c.cell(); - if (TQUnicodeTables::tqunicode_info[uc] != TQChar::Letter_Lowercase || !ci) - return c; - TQ_UINT16 upper = TQUnicodeTables::case_info[(ci<<8)+cell]; - return upper ? TQChar(upper) : c; -#else - if ( c.row() ) - return c; - return TQChar( toupper((uchar) c.latin1()) ); -#endif -} - -inline TQChar::Direction direction( const TQChar &c ) -{ -#ifndef TQT_NO_UNICODETABLES - register int pos = TQUnicodeTables::direction_info[c.row()]; - return (TQChar::Direction) (TQUnicodeTables::direction_info[(pos<<8)+c.cell()] & 0x1f); -#else - TQ_UNUSED(c); - return TQChar::DirL; -#endif -} - -inline bool mirrored( const TQChar &c ) -{ -#ifndef TQT_NO_UNICODETABLES - register int pos = TQUnicodeTables::direction_info[c.row()]; - return TQUnicodeTables::direction_info[(pos<<8)+c.cell()] > 128; -#else - TQ_UNUSED(c); - return FALSE; -#endif -} - - -inline TQChar mirroredChar( const TQChar &ch ) -{ -#ifndef TQT_NO_UNICODETABLES - if(!::mirrored( ch )) - return ch; - - int i; - int c = ch.tqunicode(); - for (i = 0; i < TQUnicodeTables::symmetricPairsSize; i ++) { - if (TQUnicodeTables::symmetricPairs[i] == c) - return TQUnicodeTables::symmetricPairs[(i%2) ? (i-1) : (i+1)]; - } -#endif - return ch; -} - -inline TQChar::Joining joining( const TQChar &ch ) -{ -#ifndef TQT_NO_UNICODETABLES - register int pos = TQUnicodeTables::direction_info[ch.row()]; - return (TQChar::Joining) ((TQUnicodeTables::direction_info[(pos<<8)+ch.cell()] >> 5) &0x3); -#else - TQ_UNUSED(ch); - return TQChar::OtherJoining; -#endif -} - -inline bool isMark( const TQChar &ch ) -{ - TQChar::Category c = ::category( ch ); - return c >= TQChar::Mark_NonSpacing && c <= TQChar::Mark_Enclosing; -} - -inline unsigned char combiningClass( const TQChar &ch ) -{ -#ifndef TQT_NO_UNICODETABLES - const int pos = TQUnicodeTables::combining_info[ch.row()]; - return TQUnicodeTables::combining_info[(pos<<8) + ch.cell()]; -#else - TQ_UNUSED(ch); - return 0; -#endif -} - -inline bool isSpace( const TQChar &ch ) -{ - if( ch.tqunicode() >= 9 && ch.tqunicode() <=13 ) return TRUE; - TQChar::Category c = ::category( ch ); - return c >= TQChar::Separator_Space && c <= TQChar::Separator_Paragraph; -} - -inline int lineBreakClass( const TQChar &ch ) -{ -#ifdef TQT_NO_UNICODETABLES - return ch.row() ? TQUnicodeTables::LineBreak_AL - : TQUnicodeTables::latin1_line_break_info[ch.cell()]; -#else - register int pos = ((int)TQUnicodeTables::line_break_info[ch.row()] << 8) + ch.cell(); - return TQUnicodeTables::line_break_info[pos]; -#endif -} - -inline int scriptForChar( ushort uc ) -{ - unsigned char script = TQUnicodeTables::scriptTable[(uc>>8)]; - if ( script >= TQUnicodeTables::SCRIPTS_INDIC ) { - if ( script == TQUnicodeTables::SCRIPTS_INDIC ) { - script = TQUnicodeTables::indicScripts[ (uc-0x0900)>>7 ]; - } else { - // 0x80 + SCRIPTS_xx - unsigned char index = script-0x80; - unsigned char cell = uc &0xff; - while( TQUnicodeTables::otherScripts[index++] < cell ) - index++; - script = TQUnicodeTables::otherScripts[index]; - } - } - return script; -} - -#ifdef TQ_WS_X11 -#define SCRIPT_FOR_CHAR( script, c ) \ -do { \ - unsigned short _uc = (c).tqunicode(); \ - if ( _uc < 0x100 ) { \ - script = TQFont::Latin; \ - } else { \ - script = (TQFont::Script)scriptForChar( _uc ); \ - } \ -} while( FALSE ) -#else -#define SCRIPT_FOR_CHAR( script, c ) \ - script = (TQFont::Script)scriptForChar( (c).tqunicode() ) -#endif - -#endif diff --git a/tqtinterface/qt4/src/tools/tquuid.cpp b/tqtinterface/qt4/src/tools/tquuid.cpp deleted file mode 100644 index 65db5fa..0000000 --- a/tqtinterface/qt4/src/tools/tquuid.cpp +++ /dev/null @@ -1,421 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQUuid class -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tquuid.h" - -#include "tqdatastream.h" - -/*! - \class TQUuid tquuid.h - \brief The TQUuid class defines a Universally Unique Identifier (UUID). - - \reentrant - - For objects or declarations that must be uniquely identified, - UUIDs (also known as GUIDs) are widely used in order to assign a - fixed and easy to compare value to the object or declaration. The - 128-bit value of a UUID is generated by an algorithm that - guarantees that the value is unique. - - In TQt, UUIDs are wrapped by the TQUuid struct which provides - convenience functions for handling UUIDs. Most platforms provide a - tool to generate new UUIDs, for example, uuidgen and guidgen. - - UUIDs generated by TQUuid, are based on the \c Random version of the - \c DCE (Distributed Computing Environment) standard. - - UUIDs can be constructed from numeric values or from strings, or - using the static createUuid() function. They can be converted to a - string with toString(). UUIDs have a variant() and a version(), - and null UUIDs return TRUE from isNull(). -*/ - -/*! - \fn TQUuid::TQUuid() - - Creates the null UUID {00000000-0000-0000-0000-000000000000}. -*/ - -/*! - \fn TQUuid::TQUuid( uint l, ushort w1, ushort w2, uchar b1, uchar b2, uchar b3, uchar b4, uchar b5, uchar b6, uchar b7, uchar b8 ) - - Creates a UUID with the value specified by the parameters, \a l, - \a w1, \a w2, \a b1, \a b2, \a b3, \a b4, \a b5, \a b6, \a b7, \a - b8. - - Example: - \code - // {67C8770B-44F1-410A-AB9A-F9B5446F13EE} - TQUuid IID_MyInterface( 0x67c8770b, 0x44f1, 0x410a, 0xab, 0x9a, 0xf9, 0xb5, 0x44, 0x6f, 0x13, 0xee ) - \endcode -*/ - -/*! - \fn TQUuid::TQUuid( const TQUuid &orig ) - - Creates a copy of the TQUuid \a orig. -*/ -#ifndef TQT_NO_TQUUID_STRING -/*! - Creates a TQUuid object from the string \a text. The function can - only convert a string in the format - {HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH} (where 'H' stands for a hex - digit). If the conversion fails a null UUID is created. -*/ -TQUuid::TQUuid( const TQString &text ) -{ - bool ok; - if ( text.isEmpty() ) { - *this = TQUuid(); - return; - } - TQString temp = text.upper(); - if ( temp[0] != '{' ) - temp = "{" + text; - if ( text[(int)text.length()-1] != '}' ) - temp += "}"; - - data1 = temp.mid( 1, 8 ).toULong( &ok, 16 ); - if ( !ok ) { - *this = TQUuid(); - return; - } - - data2 = temp.mid( 10, 4 ).toUInt( &ok, 16 ); - if ( !ok ) { - *this = TQUuid(); - return; - } - data3 = temp.mid( 15, 4 ).toUInt( &ok, 16 ); - if ( !ok ) { - *this = TQUuid(); - return; - } - data4[0] = temp.mid( 20, 2 ).toUInt( &ok, 16 ); - if ( !ok ) { - *this = TQUuid(); - return; - } - data4[1] = temp.mid( 22, 2 ).toUInt( &ok, 16 ); - if ( !ok ) { - *this = TQUuid(); - return; - } - for ( int i = 2; i<8; i++ ) { - data4[i] = temp.mid( 25 + (i-2)*2, 2 ).toUShort( &ok, 16 ); - if ( !ok ) { - *this = TQUuid(); - return; - } - } -} - -/*! - \internal -*/ -TQUuid::TQUuid( const char *text ) -{ - *this = TQUuid( TQString(text) ); -} -#endif -/*! - \fn TQUuid TQUuid::operator=(const TQUuid &uuid ) - - Assigns the value of \a uuid to this TQUuid object. -*/ - -/*! - \fn bool TQUuid::operator==(const TQUuid &other) const - - Returns TRUE if this TQUuid and the \a other TQUuid are identical; - otherwise returns FALSE. -*/ - -/*! - \fn bool TQUuid::operator!=(const TQUuid &other) const - - Returns TRUE if this TQUuid and the \a other TQUuid are different; - otherwise returns FALSE. -*/ -#ifndef TQT_NO_TQUUID_STRING -/*! - \fn TQUuid::operator TQString() const - - Returns the string representation of the uuid. - - \sa toString() -*/ - -/*! - TQString TQUuid::toString() const - - Returns the string representation of the uuid. -*/ -TQString TQUuid::toString() const -{ - TQString result; - - result = "{" + TQT_TQSTRING(TQString::number( data1, 16 )).rightJustify( 8, '0' ) + "-"; - result += TQT_TQSTRING(TQString::number( (int)data2, 16 )).rightJustify( 4, '0' ) + "-"; - result += TQT_TQSTRING(TQString::number( (int)data3, 16 )).rightJustify( 4, '0' ) + "-"; - result += TQT_TQSTRING(TQString::number( (int)data4[0], 16 )).rightJustify( 2, '0' ); - result += TQT_TQSTRING(TQString::number( (int)data4[1], 16 )).rightJustify( 2, '0' ) + "-"; - for ( int i = 2; i < 8; i++ ) - result += TQT_TQSTRING(TQString::number( (int)data4[i], 16 )).rightJustify( 2, '0' ); - - return result + "}"; -} -#endif - -#ifndef TQT_NO_DATASTREAM -/*! - \relates TQUuid - Writes the uuid \a id to the datastream \a s. -*/ -TQDataStream &operator<<( TQDataStream &s, const TQUuid &id ) -{ - s << (TQ_UINT32)id.data1; - s << (TQ_UINT16)id.data2; - s << (TQ_UINT16)id.data3; - for (int i = 0; i < 8; i++ ) - s << (TQ_UINT8)id.data4[i]; - return s; -} - -/*! - \relates TQUuid - Reads uuid from from the stream \a s into \a id. -*/ -TQDataStream &operator>>( TQDataStream &s, TQUuid &id ) -{ - TQ_UINT32 u32; - TQ_UINT16 u16; - TQ_UINT8 u8; - s >> u32; - id.data1 = u32; - s >> u16; - id.data2 = u16; - s >> u16; - id.data3 = u16; - for (int i = 0; i < 8; i++ ) { - s >> u8; - id.data4[i] = u8; - } - return s; -} -#endif - -/*! - Returns TRUE if this is the null UUID - {00000000-0000-0000-0000-000000000000}; otherwise returns FALSE. -*/ -bool TQUuid::isNull() const -{ - return data4[0] == 0 && data4[1] == 0 && data4[2] == 0 && data4[3] == 0 && - data4[4] == 0 && data4[5] == 0 && data4[6] == 0 && data4[7] == 0 && - data1 == 0 && data2 == 0 && data3 == 0; -} - -/*! - \enum TQUuid::Variant - - This enum defines the variant of the UUID, which is the scheme - which defines the tqlayout of the 128-bits value. - - \value VarUnknown Variant is unknown - \value NCS Reserved for NCS (Network Computing System) backward compatibility - \value DCE Distributed Computing Environment, the scheme used by TQUuid - \value Microsoft Reserved for Microsoft backward compatibility (GUID) - \value Reserved Reserved for future definition -*/ - -/*! - \enum TQUuid::Version - - This enum defines the version of the UUID. - - \value VerUnknown Version is unknown - \value Time Time-based, by using timestamp, clock sequence, and - MAC network card address (if available) for the node sections - \value EmbeddedPOSIX DCE Security version, with embedded POSIX UUIDs - \value Name Name-based, by using values from a name for all sections - \value Random Random-based, by using random numbers for all sections -*/ - -/*! - \fn TQUuid::Variant TQUuid::variant() const - - Returns the variant of the UUID. - The null UUID is considered to be of an unknown variant. - - \sa version() -*/ -TQUuid::Variant TQUuid::variant() const -{ - if ( isNull() ) - return VarUnknown; - // Check the 3 MSB of data4[0] - if ( (data4[0] & 0x80) == 0x00 ) return NCS; - else if ( (data4[0] & 0xC0) == 0x80 ) return DCE; - else if ( (data4[0] & 0xE0) == 0xC0 ) return Microsoft; - else if ( (data4[0] & 0xE0) == 0xE0 ) return Reserved; - return VarUnknown; -} - -/*! - \fn TQUuid::Version TQUuid::version() const - - Returns the version of the UUID, if the UUID is of the DCE - variant; otherwise returns VerUnknown. - - \sa variant() -*/ -TQUuid::Version TQUuid::version() const -{ - // Check the 4 MSB of data3 - Version ver = (Version)(data3>>12); - if ( isNull() - || (variant() != DCE) - || ver < Time - || ver > Random ) - return VerUnknown; - return ver; -} - -/*! - \fn bool TQUuid::operator<(const TQUuid &other) const - - Returns TRUE if this TQUuid is of the same variant, - and lexicographically before the \a other TQUuid; - otherwise returns FALSE. - - \sa variant() -*/ -#define ISLESS(f1, f2) if (f1!=f2) return (f1<f2); -bool TQUuid::operator<(const TQUuid &other ) const -{ - if ( variant() != other.variant() ) - return FALSE; - - ISLESS( data1, other.data1 ); - ISLESS( data2, other.data2 ); - ISLESS( data3, other.data3 ); - for ( int n = 0; n < 8; n++ ) { - ISLESS( data4[n], other.data4[n] ); - } - return FALSE; -} - -/*! - \fn bool TQUuid::operator>(const TQUuid &other) const - - Returns TRUE if this TQUuid is of the same variant, - and lexicographically after the \a other TQUuid; - otherwise returns FALSE. - - \sa variant() -*/ -#define ISMORE(f1, f2) if (f1!=f2) return (f1>f2); -bool TQUuid::operator>(const TQUuid &other ) const -{ - if ( variant() != other.variant() ) - return FALSE; - - ISMORE( data1, other.data1 ); - ISMORE( data2, other.data2 ); - ISMORE( data3, other.data3 ); - for ( int n = 0; n < 8; n++ ) { - ISMORE( data4[n], other.data4[n] ); - } - return FALSE; -} - -/*! - \fn TQUuid TQUuid::createUuid() - - Returns a new UUID of \c DCE variant, and \c Random type. The - UUIDs generated are based on the platform specific pseudo-random - generator, which is usually not a cryptographic-quality random - number generator. Therefore, a UUID is not guaranteed to be unique - cross application instances. - - On Windows, the new UUID is extremely likely to be unique on the - same or any other system, networked or not. - - \sa variant(), version() -*/ -#if defined(TQ_OS_WIN32) -#include <objbase.h> // For CoCreateGuid -TQUuid TQUuid::createUuid() -{ - GUID guid; - CoCreateGuid( &guid ); - TQUuid result = guid; - return result; -} -#else // !TQ_OS_WIN32 -#include "tqdatetime.h" -#include "stdlib.h" // For srand/rand -TQUuid TQUuid::createUuid() -{ - static const int intbits = sizeof(int)*8; - static int randbits = 0; - if ( !randbits ) { - int max = RAND_MAX; - do { ++randbits; } while ( (max=max>>1) ); - srand( (uint)TQDateTime::tqcurrentDateTime().toTime_t() ); - rand(); // Skip first - } - - TQUuid result; - uint *data = &(result.data1); - int chunks = 16 / sizeof(uint); - while ( chunks-- ) { - uint randNumber = 0; - for ( int filled = 0; filled < intbits; filled += randbits ) - randNumber |= rand()<<filled; - *(data+chunks) = randNumber; - } - - result.data4[0] = (result.data4[0] & 0x3F) | 0x80; // UV_DCE - result.data3 = (result.data3 & 0x0FFF) | 0x4000; // UV_Random - - return result; -} -#endif // !TQ_OS_WIN32 - diff --git a/tqtinterface/qt4/src/tools/tquuid.h b/tqtinterface/qt4/src/tools/tquuid.h deleted file mode 100644 index 7a2de25..0000000 --- a/tqtinterface/qt4/src/tools/tquuid.h +++ /dev/null @@ -1,194 +0,0 @@ -/**************************************************************************** -** -** Definition of TQUuid class -** -** Created : 010523 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQUUID_H -#define TQUUID_H - -#ifndef TQT_H -#include "tqstring.h" -#endif // TQT_H - -#include <string.h> - -#if defined(TQ_OS_WIN32) -#ifndef GUID_DEFINED -#define GUID_DEFINED -typedef struct _GUID -{ - ulong Data1; - ushort Data2; - ushort Data3; - uchar Data4[ 8 ]; -} GUID, *REFGUID, *LPGUID; -#endif -#endif - - -struct TQ_EXPORT TQUuid -{ - enum Variant { - VarUnknown =-1, - NCS = 0, // 0 - - - DCE = 2, // 1 0 - - Microsoft = 6, // 1 1 0 - Reserved = 7 // 1 1 1 - }; - - enum Version { - VerUnknown =-1, - Time = 1, // 0 0 0 1 - EmbeddedPOSIX = 2, // 0 0 1 0 - Name = 3, // 0 0 1 1 - Random = 4 // 0 1 0 0 - }; - - TQUuid() - { - memset( this, 0, sizeof(TQUuid) ); - } - TQUuid( uint l, ushort w1, ushort w2, uchar b1, uchar b2, uchar b3, uchar b4, uchar b5, uchar b6, uchar b7, uchar b8 ) - { - data1 = l; - data2 = w1; - data3 = w2; - data4[0] = b1; - data4[1] = b2; - data4[2] = b3; - data4[3] = b4; - data4[4] = b5; - data4[5] = b6; - data4[6] = b7; - data4[7] = b8; - } - TQUuid( const TQUuid &uuid ) - { - memcpy( this, &uuid, sizeof(TQUuid) ); - } -#ifndef TQT_NO_TQUUID_STRING - TQUuid( const TQString & ); - TQUuid( const char * ); - TQString toString() const; - operator TQString() const { return toString(); } -#endif - bool isNull() const; - - TQUuid &operator=(const TQUuid &orig ) - { - memcpy( this, &orig, sizeof(TQUuid) ); - return *this; - } - - bool operator==(const TQUuid &orig ) const - { - uint i; - if ( data1 != orig.data1 || data2 != orig.data2 || - data3 != orig.data3 ) - return FALSE; - - for( i = 0; i < 8; i++ ) - if ( data4[i] != orig.data4[i] ) - return FALSE; - - return TRUE; - } - - bool operator!=(const TQUuid &orig ) const - { - return !( *this == orig ); - } - - bool operator<(const TQUuid &other ) const; - bool operator>(const TQUuid &other ) const; - -#if defined(TQ_OS_WIN32) - // On Windows we have a type GUID that is used by the platform API, so we - // provide convenience operators to cast from and to this type. - TQUuid( const GUID &guid ) - { - memcpy( this, &guid, sizeof(GUID) ); - } - - TQUuid &operator=(const GUID &orig ) - { - memcpy( this, &orig, sizeof(TQUuid) ); - return *this; - } - - operator GUID() const - { - GUID guid = { data1, data2, data3, { data4[0], data4[1], data4[2], data4[3], data4[4], data4[5], data4[6], data4[7] } }; - return guid; - } - - bool operator==( const GUID &guid ) const - { - uint i; - if ( data1 != guid.Data1 || data2 != guid.Data2 || - data3 != guid.Data3 ) - return FALSE; - - for( i = 0; i < 8; i++ ) - if ( data4[i] != guid.Data4[i] ) - return FALSE; - - return TRUE; - } - - bool operator!=( const GUID &guid ) const - { - return !( *this == guid ); - } -#endif - static TQUuid createUuid(); - TQUuid::Variant variant() const; - TQUuid::Version version() const; - - uint data1; - ushort data2; - ushort data3; - uchar data4[ 8 ]; -}; - -#ifndef TQT_NO_DATASTREAM -TQ_EXPORT TQDataStream &operator<<( TQDataStream &, const TQUuid & ); -TQ_EXPORT TQDataStream &operator>>( TQDataStream &, TQUuid & ); -#endif - -#endif //TQUUID_H diff --git a/tqtinterface/qt4/src/tools/tqvaluelist.h b/tqtinterface/qt4/src/tools/tqvaluelist.h deleted file mode 100644 index 0928f38..0000000 --- a/tqtinterface/qt4/src/tools/tqvaluelist.h +++ /dev/null @@ -1,672 +0,0 @@ -/**************************************************************************** -** -** Definition of TQValueList class -** -** Created : 990406 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQVALUELIST_H -#define TQVALUELIST_H - -#ifndef TQT_H -#include "tqtl.h" -#include "tqshared.h" -#include "tqdatastream.h" -#endif // TQT_H - -#ifndef TQT_NO_STL -#include <iterator> -#include <list> -#include <cstddef> -#endif - -//#define TQT_CHECK_VALUELIST_RANGE - -#if defined(TQ_CC_MSVC) -#pragma warning(disable:4284) // "return type for operator -> is not a UDT" -#endif - -template <class T> -class TQValueListNode -{ -public: - TQValueListNode( const T& t ) : data( t ) { } - TQValueListNode() { } -#if defined(TQ_TEMPLATEDLL) - // Workaround MS bug in memory de/allocation in DLL vs. EXE - virtual ~TQValueListNode() { } -#endif - - TQValueListNode<T>* next; - TQValueListNode<T>* prev; - T data; -}; - -template<class T> -class TQValueListIterator -{ - public: - /** - * Typedefs - */ - typedef TQValueListNode<T>* NodePtr; -#ifndef TQT_NO_STL - typedef std::bidirectional_iterator_tag iterator_category; -#endif - typedef T value_type; - typedef size_t size_type; -#ifndef TQT_NO_STL - typedef ptrdiff_t difference_type; -#else - typedef int difference_type; -#endif - typedef T* pointer; - typedef T& reference; - - /** - * Variables - */ - NodePtr node; - - /** - * Functions - */ - TQValueListIterator() : node( 0 ) {} - TQValueListIterator( NodePtr p ) : node( p ) {} - TQValueListIterator( const TQValueListIterator<T>& it ) : node( it.node ) {} - - bool operator==( const TQValueListIterator<T>& it ) const { return node == it.node; } - bool operator!=( const TQValueListIterator<T>& it ) const { return node != it.node; } - const T& operator*() const { return node->data; } - T& operator*() { return node->data; } - // UDT for T = x* - // T* operator->() const { return &node->data; } - - TQValueListIterator<T>& operator++() { - node = node->next; - return *this; - } - - TQValueListIterator<T> operator++(int) { - TQValueListIterator<T> tmp = *this; - node = node->next; - return tmp; - } - - TQValueListIterator<T>& operator--() { - node = node->prev; - return *this; - } - - TQValueListIterator<T> operator--(int) { - TQValueListIterator<T> tmp = *this; - node = node->prev; - return tmp; - } - - TQValueListIterator<T>& operator+=( int j ) { - while ( j-- ) - node = node->next; - return *this; - } - - TQValueListIterator<T>& operator-=( int j ) { - while ( j-- ) - node = node->prev; - return *this; - } - -}; - -template<class T> -class TQValueListConstIterator -{ - public: - /** - * Typedefs - */ - typedef TQValueListNode<T>* NodePtr; -#ifndef TQT_NO_STL - typedef std::bidirectional_iterator_tag iterator_category; -#endif - typedef T value_type; - typedef size_t size_type; -#ifndef TQT_NO_STL - typedef ptrdiff_t difference_type; -#else - typedef int difference_type; -#endif - typedef const T* pointer; - typedef const T& reference; - - /** - * Variables - */ - NodePtr node; - - /** - * Functions - */ - TQValueListConstIterator() : node( 0 ) {} - TQValueListConstIterator( NodePtr p ) : node( p ) {} - TQValueListConstIterator( const TQValueListConstIterator<T>& it ) : node( it.node ) {} - TQValueListConstIterator( const TQValueListIterator<T>& it ) : node( it.node ) {} - - bool operator==( const TQValueListConstIterator<T>& it ) const { return node == it.node; } - bool operator!=( const TQValueListConstIterator<T>& it ) const { return node != it.node; } - const T& operator*() const { return node->data; } - // UDT for T = x* - // const T* operator->() const { return &node->data; } - - TQValueListConstIterator<T>& operator++() { - node = node->next; - return *this; - } - - TQValueListConstIterator<T> operator++(int) { - TQValueListConstIterator<T> tmp = *this; - node = node->next; - return tmp; - } - - TQValueListConstIterator<T>& operator--() { - node = node->prev; - return *this; - } - - TQValueListConstIterator<T> operator--(int) { - TQValueListConstIterator<T> tmp = *this; - node = node->prev; - return tmp; - } -}; - -template <class T> -class TQValueListPrivate : public TQShared -{ -public: - /** - * Typedefs - */ - typedef TQValueListIterator<T> Iterator; - typedef TQValueListConstIterator<T> ConstIterator; - typedef TQValueListNode<T> Node; - typedef TQValueListNode<T>* NodePtr; - typedef size_t size_type; - - /** - * Functions - */ - TQValueListPrivate(); - TQValueListPrivate( const TQValueListPrivate<T>& _p ); - - void derefAndDelete() // ### hack to get around hp-cc brain damage - { - if ( deref() ) - delete this; - } - -#if defined(TQ_TEMPLATEDLL) - // Workaround MS bug in memory de/allocation in DLL vs. EXE - virtual -#endif - ~TQValueListPrivate(); - - Iterator insert( Iterator it, const T& x ); - Iterator remove( Iterator it ); - NodePtr find( NodePtr start, const T& x ) const; - int findIndex( NodePtr start, const T& x ) const; - uint contains( const T& x ) const; - uint remove( const T& x ); - NodePtr at( size_type i ) const; - void clear(); - - NodePtr node; - size_type nodes; -}; - -template <class T> -TQ_INLINE_TEMPLATES TQValueListPrivate<T>::TQValueListPrivate() -{ - node = new Node; node->next = node->prev = node; nodes = 0; -} - -template <class T> -TQ_INLINE_TEMPLATES TQValueListPrivate<T>::TQValueListPrivate( const TQValueListPrivate<T>& _p ) - : TQShared() -{ - node = new Node; node->next = node->prev = node; nodes = 0; - Iterator b( _p.node->next ); - Iterator e( _p.node ); - Iterator i( node ); - while( b != e ) - insert( i, *b++ ); -} - -template <class T> -TQ_INLINE_TEMPLATES TQValueListPrivate<T>::~TQValueListPrivate() { - NodePtr p = node->next; - while( p != node ) { - NodePtr x = p->next; - delete p; - p = x; - } - delete node; -} - -template <class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQValueListPrivate<T>::Iterator TQValueListPrivate<T>::insert( TQ_TYPENAME TQValueListPrivate<T>::Iterator it, const T& x ) -{ - NodePtr p = new Node( x ); - p->next = it.node; - p->prev = it.node->prev; - it.node->prev->next = p; - it.node->prev = p; - nodes++; - return p; -} - -template <class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQValueListPrivate<T>::Iterator TQValueListPrivate<T>::remove( TQ_TYPENAME TQValueListPrivate<T>::Iterator it ) -{ - TQ_ASSERT ( it.node != node ); - NodePtr next = it.node->next; - NodePtr prev = it.node->prev; - prev->next = next; - next->prev = prev; - delete it.node; - nodes--; - return Iterator( next ); -} - -template <class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQValueListPrivate<T>::NodePtr TQValueListPrivate<T>::find( TQ_TYPENAME TQValueListPrivate<T>::NodePtr start, const T& x ) const -{ - ConstIterator first( start ); - ConstIterator last( node ); - while( first != last) { - if ( *first == x ) - return first.node; - ++first; - } - return last.node; -} - -template <class T> -TQ_INLINE_TEMPLATES int TQValueListPrivate<T>::findIndex( TQ_TYPENAME TQValueListPrivate<T>::NodePtr start, const T& x ) const -{ - ConstIterator first( start ); - ConstIterator last( node ); - int pos = 0; - while( first != last) { - if ( *first == x ) - return pos; - ++first; - ++pos; - } - return -1; -} - -template <class T> -TQ_INLINE_TEMPLATES uint TQValueListPrivate<T>::contains( const T& x ) const -{ - uint result = 0; - Iterator first = Iterator( node->next ); - Iterator last = Iterator( node ); - while( first != last) { - if ( *first == x ) - ++result; - ++first; - } - return result; -} - -template <class T> -TQ_INLINE_TEMPLATES uint TQValueListPrivate<T>::remove( const T& _x ) -{ - const T x = _x; - uint result = 0; - Iterator first = Iterator( node->next ); - Iterator last = Iterator( node ); - while( first != last) { - if ( *first == x ) { - first = remove( first ); - ++result; - } else - ++first; - } - return result; -} - -template <class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQValueListPrivate<T>::NodePtr TQValueListPrivate<T>::at( size_type i ) const -{ - TQ_ASSERT( i <= nodes ); - NodePtr p = node->next; - for( size_type x = 0; x < i; ++x ) - p = p->next; - return p; -} - -template <class T> -TQ_INLINE_TEMPLATES void TQValueListPrivate<T>::clear() -{ - nodes = 0; - NodePtr p = node->next; - while( p != node ) { - NodePtr next = p->next; - delete p; - p = next; - } - node->next = node->prev = node; -} - -#ifdef TQT_CHECK_RANGE -# if !defined( TQT_NO_DEBUG ) && defined( TQT_CHECK_VALUELIST_RANGE ) -# define TQT_CHECK_INVALID_LIST_ELEMENT if ( empty() ) qWarning( "TQValueList: Warning invalid element" ) -# define TQT_CHECK_INVALID_LIST_ELEMENT_FATAL TQ_ASSERT( !empty() ); -# else -# define TQT_CHECK_INVALID_LIST_ELEMENT -# define TQT_CHECK_INVALID_LIST_ELEMENT_FATAL -# endif -#else -# define TQT_CHECK_INVALID_LIST_ELEMENT -# define TQT_CHECK_INVALID_LIST_ELEMENT_FATAL -#endif - -template <class T> class TQDeepCopy; - -template <class T> -class TQValueList -{ -public: - /** - * Typedefs - */ - typedef TQValueListIterator<T> iterator; - typedef TQValueListConstIterator<T> const_iterator; - typedef T value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef size_t size_type; -#ifndef TQT_NO_STL - typedef ptrdiff_t difference_type; -#else - typedef int difference_type; -#endif - - /** - * API - */ - TQValueList() { sh = new TQValueListPrivate<T>; } - TQValueList( const TQValueList<T>& l ) { sh = l.sh; sh->ref(); } -#ifndef TQT_NO_STL - TQValueList( const std::list<T>& l ) - { - sh = new TQValueListPrivate<T>; - tqCopy( l.begin(), l.end(), std::back_inserter( *this ) ); - } -#endif - ~TQValueList() { sh->derefAndDelete(); } - - TQValueList<T>& operator= ( const TQValueList<T>& l ) - { - l.sh->ref(); - sh->derefAndDelete(); - sh = l.sh; - return *this; - } -#ifndef TQT_NO_STL - TQValueList<T>& operator= ( const std::list<T>& l ) - { - detach(); - tqCopy( l.begin(), l.end(), std::back_inserter( *this ) ); - return *this; - } - bool operator== ( const std::list<T>& l ) const - { - if ( size() != l.size() ) - return FALSE; - const_iterator it2 = begin(); -#if !defined(TQ_CC_MIPS) - typename -#endif - std::list<T>::const_iterator it = l.begin(); - for ( ; it2 != end(); ++it2, ++it ) - if ( !((*it2) == (*it)) ) - return FALSE; - return TRUE; - } -#endif - bool operator== ( const TQValueList<T>& l ) const; - bool operator!= ( const TQValueList<T>& l ) const { return !( *this == l ); } - iterator begin() { detach(); return iterator( sh->node->next ); } - const_iterator begin() const { return const_iterator( sh->node->next ); } - const_iterator constBegin() const { return const_iterator( sh->node->next ); } - iterator end() { detach(); return iterator( sh->node ); } - const_iterator end() const { return const_iterator( sh->node ); } - const_iterator constEnd() const { return const_iterator( sh->node ); } - iterator insert( iterator it, const T& x ) { detach(); return sh->insert( it, x ); } - uint remove( const T& x ) { detach(); return sh->remove( x ); } - void clear(); - - // ### 4.0: move out of class - TQValueList<T>& operator<< ( const T& x ) - { - append( x ); - return *this; - } - - size_type size() const { return sh->nodes; } - bool empty() const { return sh->nodes == 0; } - void push_front( const T& x ) { detach(); sh->insert( begin(), x ); } - void push_back( const T& x ) { detach(); sh->insert( end(), x ); } - iterator erase( iterator pos ) { detach(); return sh->remove( pos ); } - iterator erase( iterator first, iterator last ); - reference front() { TQT_CHECK_INVALID_LIST_ELEMENT_FATAL; return *begin(); } - const_reference front() const { TQT_CHECK_INVALID_LIST_ELEMENT_FATAL; return *begin(); } - reference back() { TQT_CHECK_INVALID_LIST_ELEMENT_FATAL; return *(--end()); } - const_reference back() const { TQT_CHECK_INVALID_LIST_ELEMENT_FATAL; return *(--end()); } - void pop_front() { TQT_CHECK_INVALID_LIST_ELEMENT; erase( begin() ); } - void pop_back() { - TQT_CHECK_INVALID_LIST_ELEMENT; - iterator tmp = end(); - erase( --tmp ); - } - void insert( iterator pos, size_type n, const T& x ); - // Some compilers (incl. vc++) would instantiate this function even if - // it is not used; this would constrain TQValueList to classes that provide - // an operator< - /* - void sort() - { - qHeapSort( *this ); - } - */ - - TQValueList<T> operator+ ( const TQValueList<T>& l ) const; - TQValueList<T>& operator+= ( const TQValueList<T>& l ); - - iterator fromLast() { detach(); return iterator( sh->node->prev ); } - const_iterator fromLast() const { return const_iterator( sh->node->prev ); } - - bool isEmpty() const { return ( sh->nodes == 0 ); } - - iterator append( const T& x ) { detach(); return sh->insert( end(), x ); } - iterator prepend( const T& x ) { detach(); return sh->insert( begin(), x ); } - - iterator remove( iterator it ) { detach(); return sh->remove( it ); } - - T& first() { TQT_CHECK_INVALID_LIST_ELEMENT; detach(); return sh->node->next->data; } - const T& first() const { TQT_CHECK_INVALID_LIST_ELEMENT; return sh->node->next->data; } - T& last() { TQT_CHECK_INVALID_LIST_ELEMENT; detach(); return sh->node->prev->data; } - const T& last() const { TQT_CHECK_INVALID_LIST_ELEMENT; return sh->node->prev->data; } - - T& operator[] ( size_type i ) { TQT_CHECK_INVALID_LIST_ELEMENT; detach(); return sh->at(i)->data; } - const T& operator[] ( size_type i ) const { TQT_CHECK_INVALID_LIST_ELEMENT; return sh->at(i)->data; } - iterator at( size_type i ) { TQT_CHECK_INVALID_LIST_ELEMENT; detach(); return iterator( sh->at(i) ); } - const_iterator at( size_type i ) const { TQT_CHECK_INVALID_LIST_ELEMENT; return const_iterator( sh->at(i) ); } - iterator tqat( size_type i ) { TQT_CHECK_INVALID_LIST_ELEMENT; detach(); return iterator( sh->at(i) ); } - const_iterator tqat( size_type i ) const { TQT_CHECK_INVALID_LIST_ELEMENT; return const_iterator( sh->at(i) ); } - iterator find ( const T& x ) { detach(); return iterator( sh->find( sh->node->next, x) ); } - const_iterator find ( const T& x ) const { return const_iterator( sh->find( sh->node->next, x) ); } - iterator find ( iterator it, const T& x ) { detach(); return iterator( sh->find( it.node, x ) ); } - const_iterator find ( const_iterator it, const T& x ) const { return const_iterator( sh->find( it.node, x ) ); } - int findIndex( const T& x ) const { return sh->findIndex( sh->node->next, x) ; } - size_type contains( const T& x ) const { return sh->contains( x ); } - - size_type count() const { return sh->nodes; } - - TQValueList<T>& operator+= ( const T& x ) - { - append( x ); - return *this; - } - typedef TQValueListIterator<T> Iterator; - typedef TQValueListConstIterator<T> ConstIterator; - typedef T ValueType; - -protected: - /** - * Helpers - */ - void detach() { if ( sh->count > 1 ) detachInternal(); } - - /** - * Variables - */ - TQValueListPrivate<T>* sh; - -private: - void detachInternal(); - - friend class TQDeepCopy< TQValueList<T> >; -}; - -template <class T> -TQ_INLINE_TEMPLATES bool TQValueList<T>::operator== ( const TQValueList<T>& l ) const -{ - if ( size() != l.size() ) - return FALSE; - const_iterator it2 = begin(); - const_iterator it = l.begin(); - for( ; it != l.end(); ++it, ++it2 ) - if ( !( *it == *it2 ) ) - return FALSE; - return TRUE; -} - -template <class T> -TQ_INLINE_TEMPLATES void TQValueList<T>::clear() -{ - if ( sh->count == 1 ) sh->clear(); else { sh->deref(); sh = new TQValueListPrivate<T>; } -} - -template <class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQValueList<T>::iterator TQValueList<T>::erase( TQ_TYPENAME TQValueList<T>::iterator first, TQ_TYPENAME TQValueList<T>::iterator last ) -{ - while ( first != last ) - erase( first++ ); - return last; -} - - -template <class T> -TQ_INLINE_TEMPLATES void TQValueList<T>::insert( TQ_TYPENAME TQValueList<T>::iterator pos, size_type n, const T& x ) -{ - for ( ; n > 0; --n ) - insert( pos, x ); -} - -template <class T> -TQ_INLINE_TEMPLATES TQValueList<T> TQValueList<T>::operator+ ( const TQValueList<T>& l ) const -{ - TQValueList<T> l2( *this ); - for( const_iterator it = l.begin(); it != l.end(); ++it ) - l2.append( *it ); - return l2; -} - -template <class T> -TQ_INLINE_TEMPLATES TQValueList<T>& TQValueList<T>::operator+= ( const TQValueList<T>& l ) -{ - TQValueList<T> copy = l; - for( const_iterator it = copy.begin(); it != copy.end(); ++it ) - append( *it ); - return *this; -} - -template <class T> -TQ_INLINE_TEMPLATES void TQValueList<T>::detachInternal() -{ - sh->deref(); sh = new TQValueListPrivate<T>( *sh ); -} - -#ifndef TQT_NO_DATASTREAM -template <class T> -TQ_INLINE_TEMPLATES TQDataStream& operator>>( TQDataStream& s, TQValueList<T>& l ) -{ - l.clear(); - TQ_UINT32 c; - s >> c; - for( TQ_UINT32 i = 0; i < c; ++i ) - { - T t; - s >> t; - l.append( t ); - if ( s.atEnd() ) - break; - } - return s; -} - -template <class T> -TQ_INLINE_TEMPLATES TQDataStream& operator<<( TQDataStream& s, const TQValueList<T>& l ) -{ - s << (TQ_UINT32)l.size(); - TQValueListConstIterator<T> it = l.begin(); - for( ; it != l.end(); ++it ) - s << *it; - return s; -} -#endif // TQT_NO_DATASTREAM - -#define TQ_DEFINED_TQVALUELIST -#define TQ_DEFINED_TQVALUELIST -#include "tqwinexport.h" -#endif // TQVALUELIST_H diff --git a/tqtinterface/qt4/src/tools/tqvaluestack.h b/tqtinterface/qt4/src/tools/tqvaluestack.h deleted file mode 100644 index e19ed69..0000000 --- a/tqtinterface/qt4/src/tools/tqvaluestack.h +++ /dev/null @@ -1,67 +0,0 @@ -/**************************************************************************** -** -** Definition of TQValueStack class -** -** Created : 990925 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQVALUESTACK_H -#define TQVALUESTACK_H - -#ifndef TQT_H -#include "tqvaluelist.h" -#endif // TQT_H - - -template<class T> -class TQValueStack : public TQValueList<T> -{ -public: - TQValueStack() {} - ~TQValueStack() {} - void push( const T& d ) { this->append(d); } - T pop() - { - T elem( this->last() ); - if ( !this->isEmpty() ) - this->remove( this->fromLast() ); - return elem; - } - T& top() { return this->last(); } - const T& top() const { return this->last(); } -}; - -#endif diff --git a/tqtinterface/qt4/src/tools/tqvaluevector.h b/tqtinterface/qt4/src/tools/tqvaluevector.h deleted file mode 100644 index be4106f..0000000 --- a/tqtinterface/qt4/src/tools/tqvaluevector.h +++ /dev/null @@ -1,579 +0,0 @@ -/**************************************************************************** -** -** Definition of TQValueVector class -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQVALUEVECTOR_H -#define TQVALUEVECTOR_H - -#include <cstddef> - -#ifndef TQT_H -#include "tqtl.h" -#include "tqshared.h" -#include "tqdatastream.h" -#endif // TQT_H - -#ifndef TQT_NO_STL -#include <vector> -#endif - -template <class T> -class TQValueVectorPrivate : public TQShared -{ -public: - typedef T value_type; - typedef T* pointer; - - TQValueVectorPrivate() - : start( 0 ), finish( 0 ), end( 0 ) - { - } - - TQValueVectorPrivate( const TQValueVectorPrivate<T>& x ); - TQValueVectorPrivate( size_t size ); - - void derefAndDelete() // work-around for hp-cc - { - if ( deref() ) - delete this; - } - -#if defined(TQ_TEMPLATEDLL) - // Workaround MS bug in memory de/allocation in DLL vs. EXE - virtual -#endif - ~TQValueVectorPrivate() - { - delete[] start; - } - - size_t size() const - { - return finish - start; - } - - bool empty() const - { - return start == finish; - } - - size_t capacity() const - { - return end - start; - } - - void insert( pointer pos, const T& x ); - void insert( pointer pos, size_t n, const T& x ); - void reserve( size_t n ); - - void clear() - { - delete[] start; - start = 0; - finish = 0; - end = 0; - } - - - pointer start; - pointer finish; - pointer end; - -private: - pointer growAndCopy( size_t n, pointer s, pointer f ); - - TQValueVectorPrivate<T>& operator=( const TQValueVectorPrivate<T>& x ); - -}; - -template <class T> -TQ_INLINE_TEMPLATES TQValueVectorPrivate<T>::TQValueVectorPrivate( const TQValueVectorPrivate<T>& x ) - : TQShared() -{ - size_t i = x.size(); - if ( i > 0 ) { - start = new T[ i ]; - finish = start + i; - end = start + i; -#if defined(__xlC__) && __xlC__ < 0x400 // xlC 3.6 confused by const - tqCopy( (pointer)x.start, (pointer)x.finish, start ); -#else - tqCopy( x.start, x.finish, start ); -#endif - } else { - start = 0; - finish = 0; - end = 0; - } -} - -template <class T> -TQ_INLINE_TEMPLATES TQValueVectorPrivate<T>::TQValueVectorPrivate( size_t size ) -{ - if ( size > 0 ) { - start = new T[size]; - finish = start + size; - end = start + size; - } else { - start = 0; - finish = 0; - end = 0; - } -} - -template <class T> -TQ_INLINE_TEMPLATES void TQValueVectorPrivate<T>::insert( pointer pos, const T& x ) -{ - const size_t lastSize = size(); - const size_t n = lastSize !=0 ? 2*lastSize : 1; - const size_t offset = pos - start; - pointer newStart = new T[n]; - pointer newFinish = newStart + offset; - tqCopy( start, pos, newStart ); - *newFinish = x; - tqCopy( pos, finish, ++newFinish ); - delete[] start; - start = newStart; - finish = newStart + lastSize + 1; - end = newStart + n; -} - -template <class T> -TQ_INLINE_TEMPLATES void TQValueVectorPrivate<T>::insert( pointer pos, size_t n, const T& x ) -{ - if ( size_t( end - finish ) >= n ) { - // enough room - const size_t elems_after = finish - pos; - pointer old_finish = finish; - if ( elems_after > n ) { - tqCopy( finish - n, finish, finish ); - finish += n; - tqCopyBackward( pos, old_finish - n, old_finish ); - tqFill( pos, pos + n, x ); - } else { - pointer filler = finish; - size_t i = n - elems_after; - for ( ; i > 0; --i, ++filler ) - *filler = x; - finish += n - elems_after; - tqCopy( pos, old_finish, finish ); - finish += elems_after; - tqFill( pos, old_finish, x ); - } - } else { - // not enough room - const size_t lastSize = size(); - const size_t len = lastSize + TQMAX( lastSize, n ); - pointer newStart = new T[len]; - pointer newFinish = tqCopy( start, pos, newStart ); - // fill up inserted space - size_t i = n; - for ( ; i > 0; --i, ++newFinish ) - *newFinish = x; - newFinish = tqCopy( pos, finish, newFinish ); - delete[] start; - start = newStart; - finish = newFinish; - end = newStart + len; - } -} - -template <class T> -TQ_INLINE_TEMPLATES void TQValueVectorPrivate<T>::reserve( size_t n ) -{ - const size_t lastSize = size(); - pointer tmp = growAndCopy( n, start, finish ); - start = tmp; - finish = tmp + lastSize; - end = start + n; -} - -template <class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQValueVectorPrivate<T>::pointer TQValueVectorPrivate<T>::growAndCopy( size_t n, pointer s, pointer f ) -{ - pointer newStart = new T[n]; - tqCopy( s, f, newStart ); - delete[] start; - return newStart; -} - -template <class T> class TQDeepCopy; - -template <class T> -class TQValueVector -{ -public: - typedef T value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef value_type* iterator; - typedef const value_type* const_iterator; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef size_t size_type; -#ifndef TQT_NO_STL - typedef ptrdiff_t difference_type; -#else - typedef int difference_type; -#endif - - TQValueVector() - { - sh = new TQValueVectorPrivate<T>; - } - - TQValueVector( const TQValueVector<T>& v ) - { - sh = v.sh; - sh->ref(); - } - - TQValueVector( size_type n, const T& val = T() ); - -#ifndef TQT_NO_STL - TQValueVector( std::vector<T>& v ) // ### remove in 4.0 - { - sh = new TQValueVectorPrivate<T>( v.size() ); - tqCopy( v.begin(), v.end(), begin() ); - } - - TQValueVector( const std::vector<T>& v ) - { - sh = new TQValueVectorPrivate<T>( v.size() ); - tqCopy( v.begin(), v.end(), begin() ); - } -#endif - - ~TQValueVector() - { - sh->derefAndDelete(); - } - - TQValueVector<T>& operator= ( const TQValueVector<T>& v ) - { - v.sh->ref(); - sh->derefAndDelete(); - sh = v.sh; - return *this; - } - -#ifndef TQT_NO_STL - TQValueVector<T>& operator= ( const std::vector<T>& v ) - { - clear(); - resize( v.size() ); - tqCopy( v.begin(), v.end(), begin() ); - return *this; - } -#endif - - size_type size() const { return sh->size(); } - - bool empty() const { return sh->empty(); } - - size_type capacity() const - { - return size_type( sh->capacity() ); - } - - iterator begin() - { - detach(); - return sh->start; - } - - const_iterator begin() const - { - return sh->start; - } - - const_iterator constBegin() const - { - return sh->start; - } - - iterator end() - { - detach(); - return sh->finish; - } - - const_iterator end() const - { - return sh->finish; - } - - const_iterator constEnd() const - { - return sh->finish; - } - - reference at( size_type i, bool* ok = 0 ) - { - detach(); - if ( ok ) - *ok = ( i < size() ); - return *( begin() + i ); - } - reference tqat( size_type i, bool* ok = 0 ) { return at(i, ok); } - - const_reference at( size_type i, bool* ok = 0 ) const - { - if ( ok ) - *ok = ( i < size() ); - return *( begin() + i ); - } - const_reference tqat( size_type i, bool* ok = 0 ) const { return at(i, ok); } - - reference operator[]( size_type i ) - { - detach(); - return *( begin() + i ); - } - - const_reference operator[]( size_type i ) const - { - return *( begin() + i ); - } - - reference front() - { - TQ_ASSERT( !empty() ); - detach(); - return *begin(); - } - - const_reference front() const - { - TQ_ASSERT( !empty() ); - return *begin(); - } - - reference back() - { - TQ_ASSERT( !empty() ); - detach(); - return *( end() - 1 ); - } - - const_reference back() const - { - TQ_ASSERT( !empty() ); - return *( end() - 1 ); - } - - void push_back( const T& x ) - { - detach(); - if ( sh->finish == sh->end ) { - sh->reserve( size()+size()/2+1 ); - } - *sh->finish = x; - ++sh->finish; - } - - void pop_back() - { - detach(); - if ( empty() ) - return; - --sh->finish; - } - - iterator insert( iterator pos, const T& x ); - iterator insert( iterator pos, size_type n, const T& x ); - - void reserve( size_type n ) - { - if ( capacity() < n ) { - detach(); - sh->reserve( n ); - } - } - - void resize( size_type n, const T& val = T() ) - { - if ( n < size() ) - erase( begin() + n, end() ); - else - insert( end(), n - size(), val ); - } - - void clear() - { - detach(); - sh->clear(); - } - - iterator erase( iterator pos ) - { - detach(); - if ( pos + 1 != end() ) - tqCopy( pos + 1, sh->finish, pos ); - --sh->finish; - return pos; - } - - iterator erase( iterator first, iterator last ) - { - detach(); - tqCopy( last, sh->finish, first ); - sh->finish = sh->finish - ( last - first ); - return first; - } - - // ### remove in TQt 4.0 - bool operator==( const TQValueVector<T>& x ) - { - return size()==x.size() ? tqEqual( constBegin(), constEnd(), x.begin()) : FALSE; - } - - bool operator==( const TQValueVector<T>& x ) const - { - return size()==x.size() ? tqEqual( begin(), end(), x.begin() ) : FALSE; - } - - typedef T ValueType; - typedef ValueType *Iterator; - typedef const ValueType *ConstIterator; - - size_type count() const { return size(); } - bool isEmpty() const { return empty(); } - - reference first() { return front(); } - const_reference first() const { return front(); } - reference last() { return back(); } - const_reference last() const { return back(); } - void append( const T& x ) { push_back( x ); } - -protected: - void detach() - { - if ( sh->count > 1 ) { detachInternal(); } - } - void detachInternal(); - TQValueVectorPrivate<T>* sh; - -private: - friend class TQDeepCopy< TQValueVector<T> >; -}; - -template <class T> -TQ_INLINE_TEMPLATES TQValueVector<T>::TQValueVector( size_type n, const T& val ) -{ - sh = new TQValueVectorPrivate<T>( n ); - tqFill( begin(), end(), val ); -} - -template <class T> -TQ_INLINE_TEMPLATES void TQValueVector<T>::detachInternal() -{ - sh->deref(); - sh = new TQValueVectorPrivate<T>( *sh ); -} - -template <class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQValueVector<T>::iterator TQValueVector<T>::insert( iterator pos, const T& x ) -{ - size_type offset = pos - sh->start; - detach(); - if ( pos == end() ) { - if ( sh->finish == sh->end ) - push_back( x ); - else { - *sh->finish = x; - ++sh->finish; - } - } else { - if ( sh->finish == sh->end ) { - sh->insert( pos, x ); - } else { - *sh->finish = *(sh->finish - 1); - ++sh->finish; - tqCopyBackward( pos, sh->finish - 2, sh->finish - 1 ); - *pos = x; - } - } - return begin() + offset; -} - -template <class T> -TQ_INLINE_TEMPLATES TQ_TYPENAME TQValueVector<T>::iterator TQValueVector<T>::insert( iterator pos, size_type n, const T& x ) -{ - if ( n != 0 ) { - size_type offset = pos - sh->start; - detach(); - pos = begin() + offset; - sh->insert( pos, n, x ); - } - return pos; -} - - -#ifndef TQT_NO_DATASTREAM -template<class T> -TQ_INLINE_TEMPLATES TQDataStream& operator>>( TQDataStream& s, TQValueVector<T>& v ) -{ - v.clear(); - TQ_UINT32 c; - s >> c; - v.resize( c ); - for( TQ_UINT32 i = 0; i < c; ++i ) - { - T t; - s >> t; - v[i] = t; - } - return s; -} - -template<class T> -TQ_INLINE_TEMPLATES TQDataStream& operator<<( TQDataStream& s, const TQValueVector<T>& v ) -{ - s << (TQ_UINT32)v.size(); - // ### use typename TQValueVector<T>::const_iterator once all supported - // ### compilers know about the 'typename' keyword. - const T* it = v.begin(); - for( ; it != v.end(); ++it ) - s << *it; - return s; -} -#endif // TQT_NO_DATASTREAM - -#define TQ_DEFINED_TQVALUEVECTOR -#include "tqwinexport.h" -#endif // TQVALUEVECTOR_H diff --git a/tqtinterface/qt4/src/tools/tqwaitcondition.h b/tqtinterface/qt4/src/tools/tqwaitcondition.h deleted file mode 100644 index a3966a2..0000000 --- a/tqtinterface/qt4/src/tools/tqwaitcondition.h +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Definition of TQWaitCondition class -** -** Created : 931107 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQWAITCONDITION_H -#define TQWAITCONDITION_H - -#ifndef TQT_H -#include "tqglobal.h" -#endif // TQT_H - -#if defined(TQT_THREAD_SUPPORT) - -#include <limits.h> - -class TQWaitConditionPrivate; -class TQMutex; - -class TQ_EXPORT TQWaitCondition -{ -public: - TQWaitCondition(); - virtual ~TQWaitCondition(); - - // default argument causes thread to block indefinately - bool wait( unsigned long time = ULONG_MAX ); - bool wait( TQMutex *mutex, unsigned long time = ULONG_MAX ); - - void wakeOne(); - void wakeAll(); - -private: - TQWaitConditionPrivate * d; - -#if defined(TQ_DISABLE_COPY) - TQWaitCondition( const TQWaitCondition & ); - TQWaitCondition &operator=( const TQWaitCondition & ); -#endif -}; - -#endif - -#endif diff --git a/tqtinterface/qt4/src/tools/tqwaitcondition_unix.cpp b/tqtinterface/qt4/src/tools/tqwaitcondition_unix.cpp deleted file mode 100644 index 89ce471..0000000 --- a/tqtinterface/qt4/src/tools/tqwaitcondition_unix.cpp +++ /dev/null @@ -1,316 +0,0 @@ -/**************************************************************************** -** -** TQWaitCondition class for Unix -** -** Created : 20010725 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#if defined(TQT_THREAD_SUPPORT) - -#include "tqplatformdefs.h" - -typedef pthread_mutex_t TQ_MUTEX_T; - -#include "tqwaitcondition.h" -#include "tqmutex.h" -#include "tqmutex_p.h" - -#include <errno.h> -#include <string.h> - - -struct TQWaitConditionPrivate { - pthread_cond_t cond; -}; - - -/*! - \class TQWaitCondition tqwaitcondition.h - \threadsafe - \brief The TQWaitCondition class allows waiting/waking for conditions between threads. - - \ingroup thread - \ingroup environment - - TQWaitConditions allow a thread to tell other threads that some - sort of condition has been met; one or many threads can block - waiting for a TQWaitCondition to set a condition with wakeOne() or - wakeAll(). Use wakeOne() to wake one randomly selected event or - wakeAll() to wake them all. For example, say we have three tasks - that should be performed every time the user presses a key; each - task could be split into a thread, each of which would have a - run() body like this: - - \code - TQWaitCondition key_pressed; - - for (;;) { - key_pressed.wait(); // This is a TQWaitCondition global variable - // Key was pressed, do something interesting - do_something(); - } - \endcode - - A fourth thread would read key presses and wake the other three - threads up every time it receives one, like this: - - \code - TQWaitCondition key_pressed; - - for (;;) { - getchar(); - // Causes any thread in key_pressed.wait() to return from - // that method and continue processing - key_pressed.wakeAll(); - } - \endcode - - Note that the order the three threads are woken up in is - undefined, and that if some or all of the threads are still in - do_something() when the key is pressed, they won't be woken up - (since they're not waiting on the condition variable) and so the - task will not be performed for that key press. This can be - avoided by, for example, doing something like this: - - \code - TQMutex mymutex; - TQWaitCondition key_pressed; - int mycount=0; - - // Worker thread code - for (;;) { - key_pressed.wait(); // This is a TQWaitCondition global variable - mymutex.lock(); - mycount++; - mymutex.unlock(); - do_something(); - mymutex.lock(); - mycount--; - mymutex.unlock(); - } - - // Key reading thread code - for (;;) { - getchar(); - mymutex.lock(); - // Sleep until there are no busy worker threads - while( mycount > 0 ) { - mymutex.unlock(); - sleep( 1 ); - mymutex.lock(); - } - mymutex.unlock(); - key_pressed.wakeAll(); - } - \endcode - - The mutexes are necessary because the results of two threads - attempting to change the value of the same variable simultaneously - are unpredictable. -*/ - -/*! - Constructs a new event signalling, i.e. wait condition, object. -*/ -TQWaitCondition::TQWaitCondition() -{ - d = new TQWaitConditionPrivate; - - int ret = pthread_cond_init(&d->cond, NULL); - -#ifdef TQT_CHECK_RANGE - if (ret) - qWarning( "Wait condition init failure: %s", strerror( ret ) ); -#endif -} - - -/*! - Deletes the event signalling, i.e. wait condition, object. -*/ -TQWaitCondition::~TQWaitCondition() -{ - int ret = pthread_cond_destroy(&d->cond); - - if (ret) { -#ifdef TQT_CHECK_RANGE - qWarning( "Wait condition destroy failure: %s", strerror( ret ) ); -#endif - - // seems we have threads waiting on us, lets wake them up - pthread_cond_broadcast(&d->cond); - } - - delete d; -} - -/*! - This wakes one thread waiting on the TQWaitCondition. The thread - that is woken up depends on the operating system's scheduling - policies, and cannot be controlled or predicted. - - \sa wakeAll() -*/ -void TQWaitCondition::wakeOne() -{ - int ret = pthread_cond_signal(&d->cond); - -#ifdef TQT_CHECK_RANGE - if (ret) - qWarning("Wait condition wakeOne failure: %s", strerror(ret)); -#endif -} - -/*! - This wakes all threads waiting on the TQWaitCondition. The order in - which the threads are woken up depends on the operating system's - scheduling policies, and cannot be controlled or predicted. - - \sa wakeOne() -*/ -void TQWaitCondition::wakeAll() -{ - int ret = pthread_cond_broadcast(&d->cond); - -#ifdef TQT_CHECK_RANGE - if (ret) - qWarning("Wait condition wakeAll failure: %s", strerror(ret)); -#endif -} - -/*! - Wait on the thread event object. The thread calling this will - block until either of these conditions is met: - \list - \i Another thread Q_SIGNALS it using wakeOne() or wakeAll(). This - function will return TRUE in this case. - \i \a time milliseconds has elapsed. If \a time is ULONG_MAX (the - default), then the wait will never timeout (the event must be - signalled). This function will return FALSE if the wait timed - out. - \endlist - - \sa wakeOne(), wakeAll() -*/ -bool TQWaitCondition::wait(unsigned long time) -{ - static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_lock( &mutex ); - - int ret; - if (time != ULONG_MAX) { - struct timeval tv; - gettimeofday(&tv, 0); - - timespec ti; - ti.tv_nsec = ( tv.tv_usec + ( time % 1000 ) * 1000 ) * 1000; - ti.tv_sec = tv.tv_sec + (time / 1000) + ( ti.tv_nsec / 1000000000 ); - ti.tv_nsec %= 1000000000; - - ret = pthread_cond_timedwait(&d->cond, &mutex, &ti); - } else - ret = pthread_cond_wait(&d->cond, &mutex); - -#ifdef TQT_CHECK_RANGE - if (ret && ret != ETIMEDOUT) - qWarning("Wait condition wait failure: %s",strerror(ret)); -#endif - - pthread_mutex_unlock( &mutex ); - - return (ret == 0); -} - -/*! - \overload - - Release the locked \a mutex and wait on the thread event object. - The \a mutex must be initially locked by the calling thread. If \a - mutex is not in a locked state, this function returns immediately. - If \a mutex is a recursive mutex, this function returns - immediately. The \a mutex will be unlocked, and the calling thread - will block until either of these conditions is met: - \list - \i Another thread Q_SIGNALS it using wakeOne() or wakeAll(). This - function will return TRUE in this case. - \i \a time milliseconds has elapsed. If \a time is ULONG_MAX (the - default), then the wait will never timeout (the event must be - signalled). This function will return FALSE if the wait timed - out. - \endlist - - The mutex will be returned to the same locked state. This function - is provided to allow the atomic transition from the locked state - to the wait state. - - \sa wakeOne(), wakeAll() -*/ -bool TQWaitCondition::wait(TQMutex *mutex, unsigned long time) -{ - if (! mutex) - return FALSE; - - if (mutex->d->type() == TQ_MUTEX_RECURSIVE) { -#ifdef TQT_CHECK_RANGE - qWarning("Wait condition warning: using recursive mutexes with\n" - " wait conditions is undefined!"); -#endif - return FALSE; - } - - int ret; - if (time != ULONG_MAX) { - struct timeval tv; - gettimeofday(&tv, 0); - - timespec ti; - ti.tv_nsec = ( tv.tv_usec + ( time % 1000 ) * 1000 ) * 1000; - ti.tv_sec = tv.tv_sec + (time / 1000) + ( ti.tv_nsec / 1000000000 ); - ti.tv_nsec %= 1000000000; - - ret = pthread_cond_timedwait(&d->cond, &mutex->d->handle, &ti); - } else - ret = pthread_cond_wait(&d->cond, &mutex->d->handle); - -#ifdef TQT_CHECK_RANGE - if (ret && ret != ETIMEDOUT) - qWarning("Wait condition wait failure: %s",strerror(ret)); -#endif - - return (ret == 0); -} - -#endif // TQT_THREAD_SUPPORT diff --git a/tqtinterface/qt4/src/tools/tqwinexport.cpp b/tqtinterface/qt4/src/tools/tqwinexport.cpp deleted file mode 100644 index 8fd0b31..0000000 --- a/tqtinterface/qt4/src/tools/tqwinexport.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#define TQ_EXPORT_TEMPLATES - -#include <tqcanvas.h> -#include <tqaccessible.h> -#include <tqconnection.h> -#include <tqguardedptr.h> -#include <tqobject.h> -#include <tqpoint.h> -#include <tqrect.h> -#include <tqsignalslotimp.h> -#include <tqwidget.h> -#include <tqhttp.h> -#include <private/tqsqlextension_p.h> -#include <tqsqlindex.h> -#include <tqtable.h> -#include <tqtable.h> -#include <tqtable.h> -#include <tqasciidict.h> -#include <tqcstring.h> -#include <tqdict.h> -#include <tqintdict.h> -#include <tqlibrary.h> -#include <tqmap.h> -#include <tqmemarray.h> -#include <tqptrlist.h> -#include <tqptrvector.h> -#include <tqstring.h> -#include <tqvaluelist.h> -#include <tqvaluevector.h> -#include <tqdockarea.h> -#include <tqdockwindow.h> diff --git a/tqtinterface/qt4/src/tools/tqwinexport.h b/tqtinterface/qt4/src/tools/tqwinexport.h deleted file mode 100644 index 0b40e59..0000000 --- a/tqtinterface/qt4/src/tools/tqwinexport.h +++ /dev/null @@ -1,224 +0,0 @@ -/**************************************************************************** -** -** Global type declarations and definitions -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#if defined(TQ_TEMPLATEDLL) && ( !defined(TQ_CC_BOR) || !defined(TQT_MAKEDLL) || defined(TQ_EXPORT_TEMPLATES) ) -// TQMOC_SKIP_BEGIN - -#if defined(TQ_DEFINED_TQASCIIDICT) && defined(TQ_DEFINED_TQCONNECTION_LIST) && !defined(TQ_EXPORTED_TQASCIIDICT_TEMPLATES) -#define TQ_EXPORTED_TQASCIIDICT_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQAsciiDictIterator<TQConnectionList>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQAsciiDict<TQConnectionList>; -#endif - -#if defined(TQ_DEFINED_TQSTYLESHEET) && defined(TQ_DEFINED_TQDICT) && !defined(TQ_EXPORTED_TQSTYLESHEET_TEMPLATES) -#define TQ_EXPORTED_TQSTYLESHEET_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQDict<TQStyleSheetItem>; -#endif - -#if defined(TQ_DEFINED_TQLIBRARY) && defined(TQ_DEFINED_TQDICT) && !defined(TQ_EXPORTED_TQDICTLIBRARY_TEMPLATES) -#define TQ_EXPORTED_TQDICTLIBRARY_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQDict<TQLibrary>; // for TQtopia -#endif - -#if defined(TQ_DEFINED_TQGUARDEDPTR) && defined(TQ_DEFINED_TQOBJECT) && !defined(TQ_EXPORTED_TQGUARDEDPTROBJECT_TEMPLATES) -#define TQ_EXPORTED_TQGUARDEDPTROBJECT_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQGuardedPtr<TQObject>; -#endif - -// needed for TQtopia -#if defined(TQ_DEFINED_TQGUARDEDPTR) && defined(TQ_DEFINED_TQWIDGET) && !defined(TQ_EXPORTED_TQGUARDEDPTRTQWIDGET_TEMPLATES) -#define TQ_EXPORTED_TQGUARDEDPTRTQWIDGET_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQGuardedPtr<TQWidget>; -#endif - -#if defined(TQ_DEFINED_TQGUARDEDPTR) && defined(TQ_DEFINED_TQACCESSIBLE_OBJECT) && !defined(TQ_EXPORTED_TQACCESSIBLEOBJECT_TEMPLATES) -#define TQ_EXPORTED_TQACCESSIBLEOBJECT_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQGuardedPtr<TQAccessibleObject>; -#endif - -#if defined(TQ_DEFINED_TQINTDICT) && !defined(TQ_EXPORTED_TQINTDICT_TEMPLATES) -#define TQ_EXPORTED_TQINTDICT_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQIntDict<int>; -#endif - -#if defined(TQ_DEFINED_TQINTDICT) && defined(TQ_DEFINED_TQWIDGET) && !defined(TQ_EXPORTED__TEMPLATES) -#define TQ_EXPORTED__TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQIntDictIterator<TQWidget>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQIntDict<TQWidget>; -#endif - -#if defined(TQ_DEFINED_TQMAP) && !defined(TQ_EXPORTED_TQMAPBASIC_TEMPLATES) -#define TQ_EXPORTED_TQMAPBASIC_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQMap<int, int>; // for TQtopia -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQMap<int, bool>; // for TQtopia -#endif - -#if defined(TQ_DEFINED_TQMAP) && defined(TQ_DEFINED_TQSTRING) && !defined(TQ_EXPORTED_TQMAPTQSTRING_TEMPLATES) -#define TQ_EXPORTED_TQMAPTQSTRING_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQMap<TQString, TQString>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQMap<TQString, int>; // for TQtopia -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQMap<int, TQString>; // for TQtopia -#endif - -#if defined(TQ_DEFINED_TQMEMARRAY) && !defined(TQ_EXPORTED_TQMEMARRAY_BASIC_TEMPLATES) -#define TQ_EXPORTED_TQMEMARRAY_BASIC_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQMemArray<int>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQMemArray<bool>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQMemArray<char>; -#endif - -#if defined(TQ_DEFINED_TQMEMARRAY) && defined(TQ_DEFINED_TQPOINT) && !defined(TQ_EXPORTED_TQMEMARAYPOINT_TEMPLATES) -#define TQ_EXPORTED_TQMEMARAYPOINT_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQMemArray<TQPoint>; -#endif - -#if defined(TQ_DEFINED_TQPTRLIST) && !defined(TQ_EXPORTED_TQPTRLIST_BASIC_TEMPLATES) -#define TQ_EXPORTED_TQPTRLIST_BASIC_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrListIterator<char>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrList<char>; -#endif - -#if defined(TQ_DEFINED_TQPTRLIST) && defined(TQ_DEFINED_TQWIDGET) && !defined(TQ_EXPORTED_TQPTRLISTWIDGET_TEMPLATES) -#define TQ_EXPORTED_TQPTRLISTWIDGET_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrListIterator<TQWidget>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrList<TQWidget>; -#endif - -#if defined(TQ_DEFINED_TQPTRLIST) && defined(TQ_DEFINED_TQCONNECTION) && !defined(TQ_EXPORTED_TQPTRLISTCONNECTION_TEMPLATES) -#define TQ_EXPORTED_TQPTRLISTCONNECTION_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrListIterator<TQConnection>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrList<TQConnection>; -#endif - -#if defined(TQ_DEFINED_TQPTRLIST) && defined(TQ_DEFINED_TQOBJECT) && !defined(TQ_EXPORTED_TQPTRLISTOBJECT_TEMPLATES) -#define TQ_EXPORTED_TQPTRLISTOBJECT_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrListIterator<TQObject>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrList<TQObject>; -#endif - -#if defined(TQ_DEFINED_TQPTRLIST) && defined(TQ_DEFINED_TQDOCKWINDOW) && !defined(TQ_EXPORTED_TQPTRLISTDOCWINDOW_TEMPLATES) -#define TQ_EXPORTED_TQPTRLISTDOCWINDOW_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrListIterator<TQDockWindow>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrList<TQDockWindow>; -#endif - -#if defined(TQ_DEFINED_TQPTRVECTOR) && !defined(TQ_EXPORTED_TQPTRVECTOR_BASIC_TEMPLATES) -#define TQ_EXPORTED_TQPTRVECTOR_BASIC_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrVector<int>; -#endif - -#if defined(TQ_DEFINED_TQPTRVECTOR) && defined(TQ_DEFINED_TQSTYLESHEET) && !defined(TQ_EXPORTED_TQPTRVECTORSTYLESHEETITEM_TEMPLATES) -#define TQ_EXPORTED_TQPTRVECTORSTYLESHEETITEM_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrVector<TQStyleSheetItem>; -#endif - -#if defined(TQ_DEFINED_TQPTRVECTOR) && defined(TQ_DEFINED_TQWIDGET) && !defined(TQ_EXPORTED_TQPTRVECTORWIDGET_TEMPLATES) -#define TQ_EXPORTED_TQPTRVECTORWIDGET_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrVector<TQWidget>; -#endif - -#if defined(TQ_DEFINED_TQPTRVECTOR) && defined(TQ_DEFINED_TQCONNECTION_LIST) && !defined(TQ_EXPORTED_TQPTRVECTORCONNECTTIONLIST_TEMPLATES) -#define TQ_EXPORTED_TQPTRVECTORCONNECTTIONLIST_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrVector<TQConnectionList>; -#endif - -#if defined(TQ_DEFINED_TQVALUELIST) && !defined(TQ_EXPORTED_TQVALUELIST_BASIC_TEMPLATES) -#define TQ_EXPORTED_TQVALUELIST_BASIC_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueListIterator<bool>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueList<bool>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueListIterator<int>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueList<int>; -#endif - -#if defined(TQ_DEFINED_TQVALUELIST) && defined(TQ_DEFINED_TQRECT) && !defined(TQ_EXPORTED_TQVALUELISTRECT_TEMPLATES) -#define TQ_EXPORTED_TQVALUELISTRECT_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueListIterator<TQRect>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueList<TQRect>; -#endif - -#if defined(TQ_DEFINED_TQVALUELIST) && defined(TQ_DEFINED_TQSTRING) && !defined(TQ_EXPORTED_TQVALUELISTSTRING_TEMPLATES) -#define TQ_EXPORTED_TQVALUELISTSTRING_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueListIterator<TQString>; -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueList<TQString>; -#endif - -// TQStylesheet template exports -#if defined(TQ_DEFINED_TQVALUELIST) && defined(TQ_DEFINED_TQPTRVECTOR) && defined(TQ_DEFINED_TQSTYLESHEET) && !defined(TQ_EXPORTED_TQSTYLESHEETITEM1_TEMPLATES) -#define TQ_EXPORTED_TQSTYLESHEETITEM1_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueList< TQPtrVector< TQStyleSheetItem> >; -#endif - -#if defined(TQ_DEFINED_TQVALUELIST) && defined(TQ_DEFINED_TQSTYLESHEET) && !defined(TQ_EXPORTED_TQSTYLESHEETITEM2_TEMPLATES) -#define TQ_EXPORTED_TQSTYLESHEETITEM2_TEMPLATES -TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQValueList<TQStyleSheetItem::ListStyle>; -#endif - -// qcanvas template exports -#if defined(TQ_DEFINED_TQPTRLIST) && defined(TQ_DEFINED_TQCANVAS) && !defined(TQ_EXPORTED_TQCANVAS1_TEMPLATES) -#define TQ_EXPORTED_TQCANVAS1_TEMPLATES -TQM_TEMPLATE_EXTERN_CANVAS template class TQM_EXPORT_CANVAS TQPtrListIterator< TQCanvasItem >; -TQM_TEMPLATE_EXTERN_CANVAS template class TQM_EXPORT_CANVAS TQPtrList< TQCanvasItem >; -TQM_TEMPLATE_EXTERN_CANVAS template class TQM_EXPORT_CANVAS TQPtrListIterator< TQCanvasView >; -TQM_TEMPLATE_EXTERN_CANVAS template class TQM_EXPORT_CANVAS TQPtrList< TQCanvasView >; -#endif - -// qtable template exports -#if defined(TQ_DEFINED_TQPTRLIST) && defined(TQ_DEFINED_TQTABLE_SELECTION) && !defined(TQ_EXPORTED_TQTABLESELECTION_TEMPLATES) -#define TQ_EXPORTED_TQTABLESELECTION_TEMPLATES -TQM_TEMPLATE_EXTERN_TABLE template class TQM_EXPORT_TABLE TQPtrList<TQTableSelection>; -#endif - -#if defined(TQ_DEFINED_TQTABLE_ITEM) && defined(TQ_DEFINED_TQPTRVECTOR) && !defined(TQ_EXPORTED_TQTABLEITEM_TEMPLATES) -#define TQ_EXPORTED_TQTABLEITEM_TEMPLATES -TQM_TEMPLATE_EXTERN_TABLE template class TQM_EXPORT_TABLE TQPtrVector<TQTableItem>; -#endif - -#if defined(TQ_DEFINED_TQTABLE) && defined(TQ_DEFINED_TQPTRVECTOR) -//TQ_TEMPLATE_EXTERN template class TQ_EXPORT TQPtrVector<TQTable>; -#endif - -// qsqlextension template exports -#if defined(TQ_DEFINED_TQSQLEXTENSION) && defined(TQ_DEFINED_TQMAP) && defined(TQ_DEFINED_TQVALUEVECTOR) && defined(TQ_DEFINED_TQSTRING) && !defined(TQ_EXPORTED_TQSQLEXTENSION_TEMPLATES) -#define TQ_EXPORTED_TQSQLEXTENSION_TEMPLATES -TQM_TEMPLATE_EXTERN_SQL template class TQM_EXPORT_SQL TQMap<TQString,Param>; -TQM_TEMPLATE_EXTERN_SQL template class TQM_EXPORT_SQL TQValueVector<Holder>; -#endif - - -// TQMOC_SKIP_END -#endif // template defined |