1 <?php 2 /************************************************************************************* 3 * cpp.php 4 * ------- 5 * Author: Iulian M 6 * Copyright: (c) 2006 Iulian M 7 * Release Version: 1.0.8.3 8 * Date Started: 2004/09/27 9 * 10 * C++ (with QT extensions) language file for GeSHi. 11 * 12 * CHANGES 13 * ------- 14 * 2008/05/23 (1.0.7.22) 15 * - Added description of extra language features (SF#1970248) 16 * 17 * TODO 18 * ---- 19 * 20 ************************************************************************************* 21 * 22 * This file is part of GeSHi. 23 * 24 * GeSHi is free software; you can redistribute it and/or modify 25 * it under the terms of the GNU General Public License as published by 26 * the Free Software Foundation; either version 2 of the License, or 27 * (at your option) any later version. 28 * 29 * GeSHi is distributed in the hope that it will be useful, 30 * but WITHOUT ANY WARRANTY; without even the implied warranty of 31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 32 * GNU General Public License for more details. 33 * 34 * You should have received a copy of the GNU General Public License 35 * along with GeSHi; if not, write to the Free Software 36 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 37 * 38 ************************************************************************************/ 39 40 $language_data = array ( 41 'LANG_NAME' => 'C++ (QT)', 42 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'), 43 'COMMENT_MULTI' => array('/*' => '*/'), 44 'COMMENT_REGEXP' => array( 45 //Multiline-continued single-line comments 46 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m', 47 //Multiline-continued preprocessor define 48 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m' 49 ), 50 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE, 51 'QUOTEMARKS' => array("'", '"'), 52 'ESCAPE_CHAR' => '', 53 'ESCAPE_REGEXP' => array( 54 //Simple Single Char Escapes 55 1 => "#\\\\[abfnrtv\\'\"?\n]#i", 56 //Hexadecimal Char Specs 57 2 => "#\\\\x[\da-fA-F]{2}#", 58 //Hexadecimal Char Specs 59 3 => "#\\\\u[\da-fA-F]{4}#", 60 //Hexadecimal Char Specs 61 4 => "#\\\\U[\da-fA-F]{8}#", 62 //Octal Char Specs 63 5 => "#\\\\[0-7]{1,3}#" 64 ), 65 'NUMBERS' => 66 GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B | 67 GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI | 68 GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO, 69 'KEYWORDS' => array( 70 1 => array( 71 'case', 'continue', 'default', 'do', 'else', 'for', 'goto', 'if', 'return', 72 'switch', 'while', 'delete', 'new', 'this' 73 ), 74 2 => array( 75 'NULL', 'false', 'break', 'true', 'enum', 'errno', 'EDOM', 76 'ERANGE', 'FLT_RADIX', 'FLT_ROUNDS', 'FLT_DIG', 'DBL_DIG', 'LDBL_DIG', 77 'FLT_EPSILON', 'DBL_EPSILON', 'LDBL_EPSILON', 'FLT_MANT_DIG', 'DBL_MANT_DIG', 78 'LDBL_MANT_DIG', 'FLT_MAX', 'DBL_MAX', 'LDBL_MAX', 'FLT_MAX_EXP', 'DBL_MAX_EXP', 79 'LDBL_MAX_EXP', 'FLT_MIN', 'DBL_MIN', 'LDBL_MIN', 'FLT_MIN_EXP', 'DBL_MIN_EXP', 80 'LDBL_MIN_EXP', 'CHAR_BIT', 'CHAR_MAX', 'CHAR_MIN', 'SCHAR_MAX', 'SCHAR_MIN', 81 'UCHAR_MAX', 'SHRT_MAX', 'SHRT_MIN', 'USHRT_MAX', 'INT_MAX', 'INT_MIN', 82 'UINT_MAX', 'LONG_MAX', 'LONG_MIN', 'ULONG_MAX', 'HUGE_VAL', 'SIGABRT', 83 'SIGFPE', 'SIGILL', 'SIGINT', 'SIGSEGV', 'SIGTERM', 'SIG_DFL', 'SIG_ERR', 84 'SIG_IGN', 'BUFSIZ', 'EOF', 'FILENAME_MAX', 'FOPEN_MAX', 'L_tmpnam', 85 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'stdin', 'stdout', 'stderr', 86 'EXIT_FAILURE', 'EXIT_SUCCESS', 'RAND_MAX', 'CLOCKS_PER_SEC', 87 'virtual', 'public', 'private', 'protected', 'template', 'using', 'namespace', 88 'try', 'catch', 'inline', 'dynamic_cast', 'const_cast', 'reinterpret_cast', 89 'static_cast', 'explicit', 'friend', 'wchar_t', 'typename', 'typeid', 'class' , 90 'foreach','connect', 'Q_OBJECT' , 'slots' , 'signals' 91 ), 92 3 => array( 93 'cin', 'cerr', 'clog', 'cout', 94 'printf', 'fprintf', 'snprintf', 'sprintf', 'assert', 95 'isalnum', 'isalpha', 'isdigit', 'iscntrl', 'isgraph', 'islower', 'isprint', 96 'ispunct', 'isspace', 'isupper', 'isxdigit', 'tolower', 'toupper', 97 'exp', 'log', 'log10', 'pow', 'sqrt', 'ceil', 'floor', 'fabs', 'ldexp', 98 'frexp', 'modf', 'fmod', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'atan2', 99 'sinh', 'cosh', 'tanh', 'setjmp', 'longjmp', 100 'va_start', 'va_arg', 'va_end', 'offsetof', 'sizeof', 'fopen', 'freopen', 101 'fflush', 'fclose', 'remove', 'rename', 'tmpfile', 'tmpname', 'setvbuf', 102 'setbuf', 'vfprintf', 'vprintf', 'vsprintf', 'fscanf', 'scanf', 'sscanf', 103 'fgetc', 'fgets', 'fputc', 'fputs', 'getc', 'getchar', 'gets', 'putc', 104 'putchar', 'puts', 'ungetc', 'fread', 'fwrite', 'fseek', 'ftell', 'rewind', 105 'fgetpos', 'fsetpos', 'clearerr', 'feof', 'ferror', 'perror', 'abs', 'labs', 106 'div', 'ldiv', 'atof', 'atoi', 'atol', 'strtod', 'strtol', 'strtoul', 'calloc', 107 'malloc', 'realloc', 'free', 'abort', 'exit', 'atexit', 'system', 'getenv', 108 'bsearch', 'qsort', 'rand', 'srand', 'strcpy', 'strncpy', 'strcat', 'strncat', 109 'strcmp', 'strncmp', 'strcoll', 'strchr', 'strrchr', 'strspn', 'strcspn', 110 'strpbrk', 'strstr', 'strlen', 'strerror', 'strtok', 'strxfrm', 'memcpy', 111 'memmove', 'memcmp', 'memchr', 'memset', 'clock', 'time', 'difftime', 'mktime', 112 'asctime', 'ctime', 'gmtime', 'localtime', 'strftime' 113 ), 114 4 => array( 115 'auto', 'bool', 'char', 'const', 'double', 'float', 'int', 'long', 'longint', 116 'register', 'short', 'shortint', 'signed', 'static', 'struct', 117 'typedef', 'union', 'unsigned', 'void', 'volatile', 'extern', 'jmp_buf', 118 'signal', 'raise', 'va_list', 'ptrdiff_t', 'size_t', 'FILE', 'fpos_t', 119 'div_t', 'ldiv_t', 'clock_t', 'time_t', 'tm', 120 ), 121 5 => array( 122 'QAbstractButton','QDir','QIntValidator','QRegExpValidator','QTabWidget','QAbstractEventDispatcher', 123 'QDirectPainter','QIODevice','QRegion','QTcpServer','QAbstractExtensionFactory','QDirModel', 124 'QItemDelegate','QResizeEvent','QTcpSocket','QAbstractExtensionManager','QDockWidget', 125 'QItemEditorCreatorBase','QResource','QTemporaryFile','QAbstractFileEngine','QDomAttr', 126 'QItemEditorFactory','QRubberBand','QTestEventList','QAbstractFileEngineHandler','QDomCDATASection', 127 'QItemSelection','QScreen','QTextBlock','QAbstractFormBuilder','QDomCharacterData','QItemSelectionModel', 128 'QScreenCursor','QTextBlockFormat','QAbstractGraphicsShapeItem','QDomComment','QItemSelectionRange', 129 'QScreenDriverFactory','QTextBlockGroup','QAbstractItemDelegate','QDomDocument','QKbdDriverFactory', 130 'QScreenDriverPlugin','QTextBlockUserData','QAbstractItemModel','QDomDocumentFragment','QKbdDriverPlugin', 131 'QScrollArea','QTextBrowser','QAbstractItemView','QDomDocumentType','QKeyEvent','QScrollBar', 132 'QTextCharFormat','QAbstractListModel','QDomElement','QKeySequence','QSemaphore','QTextCodec', 133 'QAbstractPrintDialog','QDomEntity','QLabel','QSessionManager','QTextCodecPlugin','QAbstractProxyModel', 134 'QDomEntityReference','QLatin1Char','QSet','QTextCursor','QAbstractScrollArea','QDomImplementation', 135 'QLatin1String','QSetIterator','QTextDecoder','QAbstractSlider','QDomNamedNodeMap','QLayout','QSettings', 136 'QTextDocument','QAbstractSocket','QDomNode','QLayoutItem','QSharedData','QTextDocumentFragment', 137 'QAbstractSpinBox','QDomNodeList','QLCDNumber','QSharedDataPointer','QTextEdit','QAbstractTableModel', 138 'QDomNotation','QLibrary','QShortcut','QTextEncoder','QAbstractTextDocumentLayout', 139 'QDomProcessingInstruction','QLibraryInfo','QShortcutEvent','QTextFormat','QAccessible','QDomText', 140 'QLine','QShowEvent','QTextFragment','QAccessibleBridge','QDoubleSpinBox','QLinearGradient', 141 'QSignalMapper','QTextFrame','QAccessibleBridgePlugin','QDoubleValidator','QLineEdit','QSignalSpy', 142 'QTextFrameFormat','QAccessibleEvent','QDrag','QLineF','QSize','QTextImageFormat','QAccessibleInterface', 143 'QDragEnterEvent','QLinkedList','QSizeF','QTextInlineObject','QAccessibleObject','QDragLeaveEvent', 144 'QLinkedListIterator','QSizeGrip','QTextLayout','QAccessiblePlugin','QDragMoveEvent','QLinuxFbScreen', 145 'QSizePolicy','QTextLength','QAccessibleWidget','QDropEvent','QList','QSlider','QTextLine','QAction', 146 'QDynamicPropertyChangeEvent','QListIterator','QSocketNotifier','QTextList','QActionEvent','QErrorMessage', 147 'QListView','QSortFilterProxyModel','QTextListFormat','QActionGroup','QEvent','QListWidget','QSound', 148 'QTextObject','QApplication','QEventLoop','QListWidgetItem','QSpacerItem','QTextOption','QAssistantClient', 149 'QExtensionFactory','QLocale','QSpinBox','QTextStream','QAxAggregated','QExtensionManager', 150 'QMacPasteboardMime','QSplashScreen','QTextTable','QAxBase','QFile','QMacStyle','QSplitter', 151 'QTextTableCell','QAxBindable','QFileDialog','QMainWindow','QSplitterHandle','QTextTableFormat', 152 'QAxFactory','QFileIconProvider','QMap','QSqlDatabase','QThread','QAxObject','QFileInfo','QMapIterator', 153 'QSqlDriver','QThreadStorage','QAxScript','QFileOpenEvent','QMatrix','QSqlDriverCreator','QTime', 154 'QAxScriptEngine','QFileSystemWatcher','QMenu','QSqlDriverCreatorBase','QTimeEdit','QAxScriptManager', 155 'QFlag','QMenuBar','QSqlDriverPlugin','QTimeLine','QAxWidget','QFlags','QMessageBox','QSqlError','QTimer', 156 'QBasicTimer','QFocusEvent','QMetaClassInfo','QSqlField','QTimerEvent','QBitArray','QFocusFrame', 157 'QMetaEnum','QSqlIndex','QToolBar','QBitmap','QFont','QMetaMethod','QSqlQuery','QToolBox','QBoxLayout', 158 'QFontComboBox','QMetaObject','QSqlQueryModel','QToolButton','QBrush','QFontDatabase','QMetaProperty', 159 'QSqlRecord','QToolTip','QBuffer','QFontDialog','QMetaType','QSqlRelation','QTransformedScreen', 160 'QButtonGroup','QFontInfo','QMimeData','QSqlRelationalDelegate','QTranslator','QByteArray','QFontMetrics', 161 'QMimeSource','QSqlRelationalTableModel','QTreeView','QByteArrayMatcher','QFontMetricsF','QModelIndex', 162 'QSqlResult','QTreeWidget','QCache','QFormBuilder','QMotifStyle','QSqlTableModel','QTreeWidgetItem', 163 'QCalendarWidget','QFrame','QMouseDriverFactory','QStack','QTreeWidgetItemIterator','QCDEStyle', 164 'QFSFileEngine','QMouseDriverPlugin','QStackedLayout','QUdpSocket','QChar','QFtp','QMouseEvent', 165 'QStackedWidget','QUiLoader','QCheckBox','QGenericArgument','QMoveEvent','QStandardItem','QUndoCommand', 166 'QChildEvent','QGenericReturnArgument','QMovie','QStandardItemEditorCreator','QUndoGroup', 167 'QCleanlooksStyle','QGLColormap','QMultiHash','QStandardItemModel','QUndoStack','QClipboard', 168 'QGLContext','QMultiMap','QStatusBar','QUndoView','QCloseEvent','QGLFormat','QMutableHashIterator', 169 'QStatusTipEvent','QUrl','QColor','QGLFramebufferObject','QMutableLinkedListIterator','QString', 170 'QUrlInfo','QColorDialog','QGLPixelBuffer','QMutableListIterator','QStringList','QUuid','QColormap', 171 'QGLWidget','QMutableMapIterator','QStringListModel','QValidator','QComboBox','QGradient', 172 'QMutableSetIterator','QStringMatcher','QVariant','QCommonStyle','QGraphicsEllipseItem', 173 'QMutableVectorIterator','QStyle','QVarLengthArray','QCompleter','QGraphicsItem','QMutex', 174 'QStyleFactory','QVBoxLayout','QConicalGradient','QGraphicsItemAnimation','QMutexLocker', 175 'QStyleHintReturn','QVector','QContextMenuEvent','QGraphicsItemGroup','QNetworkAddressEntry', 176 'QStyleHintReturnMask','QVectorIterator','QCopChannel','QGraphicsLineItem','QNetworkInterface', 177 'QStyleOption','QVFbScreen','QCoreApplication','QGraphicsPathItem','QNetworkProxy','QStyleOptionButton', 178 'QVNCScreen','QCursor','QGraphicsPixmapItem','QObject','QStyleOptionComboBox','QWaitCondition', 179 'QCustomRasterPaintDevice','QGraphicsPolygonItem','QObjectCleanupHandler','QStyleOptionComplex', 180 'QWhatsThis','QDataStream','QGraphicsRectItem','QPageSetupDialog','QStyleOptionDockWidget', 181 'QWhatsThisClickedEvent','QDataWidgetMapper','QGraphicsScene','QPaintDevice','QStyleOptionFocusRect', 182 'QWheelEvent','QDate','QGraphicsSceneContextMenuEvent','QPaintEngine','QStyleOptionFrame','QWidget', 183 'QDateEdit','QGraphicsSceneEvent','QPaintEngineState','QStyleOptionFrameV2','QWidgetAction','QDateTime', 184 'QGraphicsSceneHoverEvent','QPainter','QStyleOptionGraphicsItem','QWidgetItem','QDateTimeEdit', 185 'QGraphicsSceneMouseEvent','QPainterPath','QStyleOptionGroupBox','QWindowsMime','QDBusAbstractAdaptor', 186 'QGraphicsSceneWheelEvent','QPainterPathStroker','QStyleOptionHeader','QWindowsStyle', 187 'QDBusAbstractInterface','QGraphicsSimpleTextItem','QPaintEvent','QStyleOptionMenuItem', 188 'QWindowStateChangeEvent','QDBusArgument','QGraphicsSvgItem','QPair','QStyleOptionProgressBar', 189 'QWindowsXPStyle','QDBusConnection','QGraphicsTextItem','QPalette','QStyleOptionProgressBarV2', 190 'QWorkspace','QDBusConnectionInterface','QGraphicsView','QPen','QStyleOptionQ3DockWindow','QWriteLocker', 191 'QDBusError','QGridLayout','QPersistentModelIndex','QStyleOptionQ3ListView','QWSCalibratedMouseHandler', 192 'QDBusInterface','QGroupBox','QPicture','QStyleOptionQ3ListViewItem','QWSClient','QDBusMessage','QHash', 193 'QPictureFormatPlugin','QStyleOptionRubberBand','QWSEmbedWidget','QDBusObjectPath','QHashIterator', 194 'QPictureIO','QStyleOptionSizeGrip','QWSEvent','QDBusReply','QHBoxLayout','QPixmap','QStyleOptionSlider', 195 'QWSInputMethod','QDBusServer','QHeaderView','QPixmapCache','QStyleOptionSpinBox','QWSKeyboardHandler', 196 'QDBusSignature','QHelpEvent','QPlastiqueStyle','QStyleOptionTab','QWSMouseHandler','QDBusVariant', 197 'QHideEvent','QPluginLoader','QStyleOptionTabBarBase','QWSPointerCalibrationData','QDecoration', 198 'QHostAddress','QPoint','QStyleOptionTabV2','QWSScreenSaver','QDecorationFactory','QHostInfo','QPointer', 199 'QStyleOptionTabWidgetFrame','QWSServer','QDecorationPlugin','QHoverEvent','QPointF','QStyleOptionTitleBar', 200 'QWSTslibMouseHandler','QDesignerActionEditorInterface','QHttp','QPolygon','QStyleOptionToolBar','QWSWindow', 201 'QDesignerContainerExtension','QHttpHeader','QPolygonF','QStyleOptionToolBox','QWSWindowSurface', 202 'QDesignerCustomWidgetCollectionInterface','QHttpRequestHeader','QPrintDialog','QStyleOptionToolButton', 203 'QX11EmbedContainer','QDesignerCustomWidgetInterface','QHttpResponseHeader','QPrintEngine', 204 'QStyleOptionViewItem','QX11EmbedWidget','QDesignerFormEditorInterface','QIcon','QPrinter', 205 'QStyleOptionViewItemV2','QX11Info','QDesignerFormWindowCursorInterface','QIconDragEvent','QProcess', 206 'QStylePainter','QXmlAttributes','QDesignerFormWindowInterface','QIconEngine','QProgressBar', 207 'QStylePlugin','QXmlContentHandler','QDesignerFormWindowManagerInterface','QIconEnginePlugin', 208 'QProgressDialog','QSvgRenderer','QXmlDeclHandler','QDesignerMemberSheetExtension','QImage', 209 'QProxyModel','QSvgWidget','QXmlDefaultHandler','QDesignerObjectInspectorInterface','QImageIOHandler', 210 'QPushButton','QSyntaxHighlighter','QXmlDTDHandler','QDesignerPropertyEditorInterface','QImageIOPlugin', 211 'QQueue','QSysInfo','QXmlEntityResolver','QDesignerPropertySheetExtension','QImageReader','QRadialGradient', 212 'QSystemLocale','QXmlErrorHandler','QDesignerTaskMenuExtension','QImageWriter','QRadioButton', 213 'QSystemTrayIcon','QXmlInputSource','QDesignerWidgetBoxInterface','QInputContext','QRasterPaintEngine', 214 'QTabBar','QXmlLexicalHandler','QDesktopServices','QInputContextFactory','QReadLocker','QTabletEvent', 215 'QXmlLocator','QDesktopWidget','QInputContextPlugin','QReadWriteLock','QTableView','QXmlNamespaceSupport', 216 'QDial','QInputDialog','QRect','QTableWidget','QXmlParseException','QDialog','QInputEvent','QRectF', 217 'QTableWidgetItem','QXmlReader','QDialogButtonBox','QInputMethodEvent','QRegExp', 218 'QTableWidgetSelectionRange','QXmlSimpleReader' 219 ) 220 ), 221 'SYMBOLS' => array( 222 '(', ')', '{', '}', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':', ',', ';', '|', '<', '>' 223 ), 224 'CASE_SENSITIVE' => array( 225 GESHI_COMMENTS => false, 226 1 => true, 227 2 => true, 228 3 => true, 229 4 => true, 230 5 => true, 231 ), 232 'STYLES' => array( 233 'KEYWORDS' => array( 234 1 => 'color: #000000; font-weight:bold;', 235 2 => 'color: #0057AE;', 236 3 => 'color: #2B74C7;', 237 4 => 'color: #0057AE;', 238 5 => 'color: #22aadd;' 239 ), 240 'COMMENTS' => array( 241 1 => 'color: #888888;', 242 2 => 'color: #006E28;', 243 'MULTI' => 'color: #888888; font-style: italic;' 244 ), 245 'ESCAPE_CHAR' => array( 246 0 => 'color: #000099; font-weight: bold;', 247 1 => 'color: #000099; font-weight: bold;', 248 2 => 'color: #660099; font-weight: bold;', 249 3 => 'color: #660099; font-weight: bold;', 250 4 => 'color: #660099; font-weight: bold;', 251 5 => 'color: #006699; font-weight: bold;', 252 'HARD' => '', 253 ), 254 'BRACKETS' => array( 255 0 => 'color: #006E28;' 256 ), 257 'STRINGS' => array( 258 0 => 'color: #BF0303;' 259 ), 260 'NUMBERS' => array( 261 0 => 'color: #B08000;', 262 GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;', 263 GESHI_NUMBER_OCT_PREFIX => 'color: #208080;', 264 GESHI_NUMBER_HEX_PREFIX => 'color: #208080;', 265 GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;', 266 GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;', 267 GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;', 268 GESHI_NUMBER_FLT_NONSCI => 'color:#800080;' 269 ), 270 'METHODS' => array( 271 1 => 'color: #2B74C7;', 272 2 => 'color: #2B74C7;', 273 3 => 'color: #2B74C7;' 274 ), 275 'SYMBOLS' => array( 276 0 => 'color: #006E28;' 277 ), 278 'REGEXPS' => array( 279 ), 280 'SCRIPT' => array( 281 ) 282 ), 283 'URLS' => array( 284 1 => '', 285 2 => '', 286 3 => '', 287 4 => '', 288 5 => 'http://doc.trolltech.com/latest/{FNAMEL}.html' 289 ), 290 'OOLANG' => true, 291 'OBJECT_SPLITTERS' => array( 292 1 => '.', 293 2 => '::', 294 3 => '->', 295 ), 296 'REGEXPS' => array( 297 ), 298 'STRICT_MODE_APPLIES' => GESHI_NEVER, 299 'SCRIPT_DELIMITERS' => array( 300 ), 301 'HIGHLIGHT_STRICT_BLOCK' => array( 302 ), 303 'TAB_WIDTH' => 4, 304 'PARSER_CONTROL' => array( 305 'KEYWORDS' => array( 306 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#>|^])", 307 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_<\|%\\-])" 308 ), 309 'OOLANG' => array( 310 'MATCH_AFTER' => '~?[a-zA-Z][a-zA-Z0-9_]*', 311 ) 312 ) 313 ); 314 315 ?>