Initial Commit
[packages] / xemacs-packages / prog-modes / php-mode.el
1 ;;; php-mode.el --- major mode for editing PHP code
2
3 ;; Copyright (C) 1999-2004 Turadg Aleahmad
4
5 ;; Maintainer: Turadg Aleahmad <turadg at users.sourceforge.net>
6 ;; Keywords: php languages oop
7 ;; Created: 1999-05-17
8 ;; Modified: 2004-01-24
9 ;; X-URL:   http://php-mode.sourceforge.net/
10
11 (defconst php-version "1.1.0"
12   "PHP Mode version number.")
13
14 ;;; License
15
16 ;; This program is free software; you can redistribute it and/or
17 ;; modify it under the terms of the GNU General Public License
18 ;; as published by the Free Software Foundation; either version 2
19 ;; of the License, or (at your option) any later version.
20
21 ;; This program is distributed in the hope that it will be useful,
22 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
23 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 ;; GNU General Public License for more details.
25
26 ;; You should have received a copy of the GNU General Public License
27 ;; along with this program; if not, write to the Free Software
28 ;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
29
30 ;;; Usage
31
32 ;; Rename this file to php-mode.el if it isn't already then place it in
33 ;; your Emacs lisp path (eg. site-lisp) and add to your .emacs file:
34 ;;   (require 'php-mode)
35
36 ;; If you want colorization, turn on global-font-lock or
37 ;; add this to your .emacs:
38 ;;   (add-hook 'php-mode-user-hook 'turn-on-font-lock)
39
40 ;; To use abbrev-mode, add lines like this:
41 ;;   (add-hook 'php-mode-user-hook
42 ;;     '(lambda () (define-abbrev php-mode-abbrev-table "ex" "extends")))
43
44 ;; To make php-mode compatible with html-mode, see http://php-mode.sf.net
45
46 ;; Many options available under Help:Customize
47 ;; Options specific to php-mode are in
48 ;;  Programming/Languages/Php
49 ;; Since it inherits much functionality from c-mode, look there too
50 ;;  Programming/Languages/C
51
52 ;;; Commentary:
53
54 ;; PHP mode is a major mode for editing PHP 3 and 4 source code.  It's
55 ;; an extension of C mode; thus it inherits all C mode's navigation
56 ;; functionality.  But it colors according to the PHP grammar and indents
57 ;; according to the PEAR coding guidelines.  It also includes a couple
58 ;; handy IDE-type features such as documentation search and a source
59 ;; and class browser.
60
61
62 ;;; Contributors: (in chronological order)
63
64 ;; Juanjo, Torsten Martinsen, Vinai Kopp, Sean Champ, Doug Marcey,
65 ;; Kevin Blake, Rex McMaster, Mathias Meyer, Boris Folgmann, Roland
66 ;; Rosenfeld, Fred Yankowski, Craig Andrews, John Keller, Ryan
67 ;; Sammartino, ppercot, Valentin Funk, Stig Bakken, Gregory Stark,
68 ;; Chris Morris, Nils Rennebarth, Gerrit Riessen, Eric Mc Sween,
69 ;; Ville Skytta, Giacomo Tesio
70
71 ;;; Changelog:
72
73 ;; 1.1
74 ;;   Added PHP5 support (Giacomo Tesio)
75 ;;     known problem: doesn't highlight after first 'implements'
76 ;;   Better XEmacs compatibility (imenu, regexp, and comments!) (Ville Skytta)
77 ;;   Improvement to php-conditional-key regexp (Eric Mc Sween)
78
79 ;; 1.05
80 ;;   Incorporated speedbar defs by Gerrit Riessen
81 ;;   Add "foreach" to conditional introducing keywords (Nils Rennebarth)
82 ;;   Cleared the Changelog
83 ;;   Moved contribution credits into comments above
84
85
86 ;;; Code:
87
88 (require 'speedbar)
89 (require 'font-lock)
90 (require 'cc-mode)
91 (require 'custom)
92 (eval-when-compile
93   (require 'regexp-opt))
94
95 ;; Local variables
96 (defgroup php nil
97   "Major mode for editing PHP code."
98   :prefix "php-"
99   :group 'languages)
100
101 (defcustom php-speedbar-config t
102   "*When set to true automatically configures Speedbar to observe PHP files.\
103 Ignores php-file patterns option; fixed to expression \"\\.\\(inc\\|php[s34]?\\)\""
104   :type 'boolean
105   :group 'php)
106
107 (defcustom php-mode-speedbar-open nil
108   "Normally php-mode starts with the speedbar closed.\
109 Turning this on will open it whenever php-mode is loaded."
110   :type 'boolean
111   :group 'php)
112
113 (defcustom php-manual-url "http://www.php.net/manual/en/manual.php"
114   "*URL at which to find PHP manual.\
115 You can replace \"en\" with your ISO language code."
116   :type 'string
117   :group 'php)
118
119 (defcustom php-search-url "http://www.php.net/"
120   "*URL at which to search for documentation on a word"
121   :type 'string
122   :group 'php)
123
124 ;;;###autoload
125 (defcustom php-file-patterns (list "\\.php[s34]?\\'" "\\.phtml\\'" "\\.inc\\'")
126   "*List of file patterns for which to automatically invoke php-mode."
127   :type '(repeat (regexp :tag "Pattern"))
128   :group 'php)
129
130 (defcustom php-mode-user-hook nil
131   "List of functions to be executed on entry to php-mode"
132   :type 'hook
133   :group 'php)
134
135 (defcustom php-mode-force-pear nil
136   "Normally PEAR coding rules are enforced only when the filename contains \"PEAR\"\
137 Turning this on will force PEAR rules on all PHP files."
138   :type 'boolean
139   :group 'php)
140
141 ;; Note whether we're in XEmacs
142 (defconst xemacsp (string-match "Lucid\\|XEmacs" emacs-version)
143   "Non nil if using XEmacs.")
144
145 ;; XEmacs hack: autoload a dummy autoload instead of a derived mode.
146 ;;;###autoload(autoload 'php-mode "php-mode" nil t)
147 (define-derived-mode php-mode c-mode "PHP"
148   "Major mode for editing PHP code.\n\n\\{php-mode-map}"
149   
150   (setq comment-start "// "
151         comment-end   ""
152         comment-start-skip "// *")
153   
154   (setq c-class-key php-class-key)
155   (setq c-conditional-key php-conditional-key)
156
157   (defvar php-mode-syntax-table php-mode-syntax-table)
158   ;; this line makes $ into punctuation instead of a word constituent
159   ;; it used to be active, but it killed indenting of case lines that
160   ;; begin with '$' (many do).  If anyone has a solution to this
161   ;; problem, please let me know.  Of course, you're welcome to
162   ;; uncomment this line in your installation.
163 ;  (modify-syntax-entry ?$ "." php-mode-syntax-table)
164   
165   ;; The above causes XEmacs to handle shell-style comments correctly,
166   ;; but fails to work in GNU Emacs which fails to interpret \n as the
167   ;; end of the comment.
168   (if xemacsp (progn
169                 (modify-syntax-entry ?# "< b" php-mode-syntax-table)
170                 (modify-syntax-entry ?\n "> b" php-mode-syntax-table)
171                 ))
172   
173   (make-local-variable 'font-lock-defaults)
174   (setq font-lock-defaults
175         '((php-font-lock-keywords-1
176            php-font-lock-keywords-2
177            ;; Comment-out the next line if the font-coloring is too
178            ;; extreme/ugly for you.
179            php-font-lock-keywords-3
180            )
181           nil                           ; KEYWORDS-ONLY
182           T                             ; CASE-FOLD
183           nil                           ; SYNTAX-ALIST
184           nil                           ; SYNTAX-BEGIN
185           (font-lock-syntactic-keywords . php-font-lock-syntactic-keywords)))
186   
187   (setq font-lock-maximum-decoration t
188         case-fold-search t              ; PHP vars are case-sensitive
189         imenu-generic-expression php-imenu-generic-expression)
190   
191   ;; Do not force newline at end of file.  Such newlines can cause
192   ;; trouble if the PHP file is included in another file before calls
193   ;; to header() or cookie().
194   (set (make-local-variable 'require-final-newline) nil)
195   (set (make-local-variable 'next-line-add-newlines) nil)
196   
197   ;; PEAR coding standards
198   (make-local-hook 'php-mode-pear-hook)
199   (add-hook 'php-mode-pear-hook
200             (lambda nil (set (make-local-variable 'tab-width) 4)) nil t)
201   (add-hook 'php-mode-pear-hook
202             (lambda nil (set (make-local-variable 'c-basic-offset) 4)) nil t)
203   (add-hook 'php-mode-pear-hook
204             (lambda nil (set (make-local-variable 'c-hanging-comment-ender-p) nil)) nil t)
205   (add-hook 'php-mode-pear-hook
206             (lambda nil (set (make-local-variable 'indent-tabs-mode) nil)) nil t)
207   (add-hook 'php-mode-pear-hook
208             (lambda nil (c-set-offset 'block-open' - )) nil t)
209   (add-hook 'php-mode-pear-hook
210             (lambda nil (c-set-offset 'block-close' 0 )) nil t)
211
212   (if (or php-mode-force-pear
213           (and (stringp buffer-file-name)
214                (string-match "PEAR\\|pear"
215                              (buffer-file-name))
216                (string-match "\\.php$" (buffer-file-name))))
217       (run-hooks 'php-mode-pear-hook))
218   
219   (run-hooks 'php-mode-user-hook)
220   )
221
222 ;; Make php-mode the default mode for PHP source code buffers.
223 ;;;###autoload
224 (let ((php-file-patterns-temp php-file-patterns))
225   (while php-file-patterns-temp
226     (add-to-list 'auto-mode-alist
227                   (cons (car php-file-patterns-temp) 'php-mode))
228     (setq php-file-patterns-temp (cdr php-file-patterns-temp))))
229
230 ;; Handle Speedbar
231 (if php-mode-speedbar-open
232     (speedbar 1))
233 (if (and php-speedbar-config (symbolp 'speedbar))
234     (speedbar-add-supported-extension "\\.\\(inc\\|php[s34]?\\)"))
235
236 ;; Make a menu keymap (with a prompt string)
237 ;; and make it the menu bar item's definition.
238 (define-key php-mode-map [menu-bar] (make-sparse-keymap))
239 (define-key php-mode-map [menu-bar php]
240   (cons "PHP" (make-sparse-keymap "PHP")))
241
242 ;; Define specific subcommands in this menu.
243 (define-key php-mode-map [menu-bar php complete-function]
244   '("Complete function name" . php-complete-function))
245 (define-key php-mode-map
246   [menu-bar php browse-manual]
247   '("Browse manual" . php-browse-manual))
248 (define-key php-mode-map
249   [menu-bar php search-documentation]
250   '("Search documentation" . php-search-documentation))
251
252 ;; Define function name completion function
253 (defun php-complete-function ()
254   "Complete the function name at the point from known PHP functions."
255   (interactive)
256   (message "php-complete-function not implemented yet")
257   ;; how to read the list of functions from a separate file?
258   )
259
260 ;; Define function documentation function
261 (defun php-search-documentation ()
262   "Search PHP documentation for the word at the point."
263   (interactive)
264   (browse-url (concat php-search-url (current-word t)))
265   )
266
267 ;; Define function for browsing manual
268 (defun php-browse-manual ()
269   "Bring up manual for PHP."
270   (interactive)
271   (browse-url php-manual-url)
272   )
273
274 ;; Define shortcut
275 (define-key php-mode-map
276   "\C-c\C-f"
277   'php-search-documentation)
278
279 ;; Define shortcut
280 (define-key php-mode-map
281   "\C-c\C-m"
282   'php-browse-manual)
283
284 (defconst php-constants
285   (eval-when-compile
286     (regexp-opt
287      '(;; core constants
288        "__LINE__" "__FILE__"
289        "PHP_OS" "PHP_VERSION" 
290        "TRUE" "FALSE" "NULL"
291        "E_ERROR" "E_NOTICE" "E_PARSE" "E_WARNING" "E_ALL"
292        "E_USER_ERROR" "E_USER_WARNING" "E_USER_NOTICE"
293        "DEFAULT_INCLUDE_PATH" "PEAR_INSTALL_DIR" "PEAR_EXTENSION_DIR"
294        "PHP_BINDIR" "PHP_LIBDIR" "PHP_DATADIR" "PHP_SYSCONFDIR"
295        "PHP_LOCALSTATEDIR" "PHP_CONFIG_FILE_PATH"
296
297        ;; from ext/standard:
298        "EXTR_OVERWRITE" "EXTR_SKIP" "EXTR_PREFIX_SAME"
299        "EXTR_PREFIX_ALL" "EXTR_PREFIX_INVALID" "SORT_ASC" "SORT_DESC"
300        "SORT_REGULAR" "SORT_NUMERIC" "SORT_STRING" "ASSERT_ACTIVE"
301        "ASSERT_CALLBACK" "ASSERT_BAIL" "ASSERT_WARNING"
302        "ASSERT_QUIET_EVAL" "CONNECTION_ABORTED" "CONNECTION_NORMAL"
303        "CONNECTION_TIMEOUT" "M_E" "M_LOG2E" "M_LOG10E" "M_LN2"
304        "M_LN10" "M_PI" "M_PI_2" "M_PI_4" "M_1_PI" "M_2_PI"
305        "M_2_SQRTPI" "M_SQRT2" "M_SQRT1_2" "CRYPT_SALT_LENGTH"
306        "CRYPT_STD_DES" "CRYPT_EXT_DES" "CRYPT_MD5" "CRYPT_BLOWFISH"
307        "DIRECTORY_SEPARATOR" "SEEK_SET" "SEEK_CUR" "SEEK_END"
308        "LOCK_SH" "LOCK_EX" "LOCK_UN" "LOCK_NB" "HTML_SPECIALCHARS"
309        "HTML_ENTITIES" "ENT_COMPAT" "ENT_QUOTES" "ENT_NOQUOTES"
310        "INFO_GENERAL" "INFO_CREDITS" "INFO_CONFIGURATION"
311        "INFO_ENVIRONMENT" "INFO_VARIABLES" "INFO_LICENSE" "INFO_ALL"
312        "CREDITS_GROUP" "CREDITS_GENERAL" "CREDITS_SAPI"
313        "CREDITS_MODULES" "CREDITS_DOCS" "CREDITS_FULLPAGE"
314        "CREDITS_QA" "CREDITS_ALL" "PHP_OUTPUT_HANDLER_START"
315        "PHP_OUTPUT_HANDLER_CONT" "PHP_OUTPUT_HANDLER_END"
316        "STR_PAD_LEFT" "STR_PAD_RIGHT" "STR_PAD_BOTH"
317        "PATHINFO_DIRNAME" "PATHINFO_BASENAME" "PATHINFO_EXTENSION"
318        "CHAR_MAX" "LC_CTYPE" "LC_NUMERIC" "LC_TIME" "LC_COLLATE"
319        "LC_MONETARY" "LC_ALL" "LC_MESSAGES" "LOG_EMERG" "LOG_ALERT"
320        "LOG_CRIT" "LOG_ERR" "LOG_WARNING" "LOG_NOTICE" "LOG_INFO"
321        "LOG_DEBUG" "LOG_KERN" "LOG_USER" "LOG_MAIL" "LOG_DAEMON"
322        "LOG_AUTH" "LOG_SYSLOG" "LOG_LPR" "LOG_NEWS" "LOG_UUCP"
323        "LOG_CRON" "LOG_AUTHPRIV" "LOG_LOCAL0" "LOG_LOCAL1"
324        "LOG_LOCAL2" "LOG_LOCAL3" "LOG_LOCAL4" "LOG_LOCAL5"
325        "LOG_LOCAL6" "LOG_LOCAL7" "LOG_PID" "LOG_CONS" "LOG_ODELAY"
326        "LOG_NDELAY" "LOG_NOWAIT" "LOG_PERROR"
327        
328        ;; Disabled by default because they slow buffer loading
329        ;; If you have use for them, decomment the strings 
330        ;; that you want colored.
331        ;; To compile, you may have to increase 'max-specpdl-size'
332
333        ;; from other bundled extensions:
334 ;        "CAL_EASTER_TO_xxx" "VT_NULL" "VT_EMPTY" "VT_UI1" "VT_I2"
335 ;        "VT_I4" "VT_R4" "VT_R8" "VT_BOOL" "VT_ERROR" "VT_CY" "VT_DATE"
336 ;        "VT_BSTR" "VT_DECIMAL" "VT_UNKNOWN" "VT_DISPATCH" "VT_VARIANT"
337 ;        "VT_I1" "VT_UI2" "VT_UI4" "VT_INT" "VT_UINT" "VT_ARRAY"
338 ;        "VT_BYREF" "CP_ACP" "CP_MACCP" "CP_OEMCP" "CP_SYMBOL"
339 ;        "CP_THREAD_ACP" "CP_UTF7" "CP_UTF8" "CPDF_PM_NONE"
340 ;        "CPDF_PM_OUTLINES" "CPDF_PM_THUMBS" "CPDF_PM_FULLSCREEN"
341 ;        "CPDF_PL_SINGLE" "CPDF_PL_1COLUMN" "CPDF_PL_2LCOLUMN"
342 ;        "CPDF_PL_2RCOLUMN" "CURLOPT_PORT" "CURLOPT_FILE"
343 ;        "CURLOPT_INFILE" "CURLOPT_INFILESIZE" "CURLOPT_URL"
344 ;        "CURLOPT_PROXY" "CURLOPT_VERBOSE" "CURLOPT_HEADER"
345 ;        "CURLOPT_HTTPHEADER" "CURLOPT_NOPROGRESS" "CURLOPT_NOBODY"
346 ;        "CURLOPT_FAILONERROR" "CURLOPT_UPLOAD" "CURLOPT_POST"
347 ;        "CURLOPT_FTPLISTONLY" "CURLOPT_FTPAPPEND" "CURLOPT_NETRC"
348 ;        "CURLOPT_FOLLOWLOCATION" "CURLOPT_FTPASCII" "CURLOPT_PUT"
349 ;        "CURLOPT_MUTE" "CURLOPT_USERPWD" "CURLOPT_PROXYUSERPWD"
350 ;        "CURLOPT_RANGE" "CURLOPT_TIMEOUT" "CURLOPT_POSTFIELDS"
351 ;        "CURLOPT_REFERER" "CURLOPT_USERAGENT" "CURLOPT_FTPPORT"
352 ;        "CURLOPT_LOW_SPEED_LIMIT" "CURLOPT_LOW_SPEED_TIME"
353 ;        "CURLOPT_RESUME_FROM" "CURLOPT_COOKIE" "CURLOPT_SSLCERT"
354 ;        "CURLOPT_SSLCERTPASSWD" "CURLOPT_WRITEHEADER"
355 ;        "CURLOPT_COOKIEFILE" "CURLOPT_SSLVERSION"
356 ;        "CURLOPT_TIMECONDITION" "CURLOPT_TIMEVALUE"
357 ;        "CURLOPT_CUSTOMREQUEST" "CURLOPT_STDERR" "CURLOPT_TRANSFERTEXT"
358 ;        "CURLOPT_RETURNTRANSFER" "CURLOPT_QUOTE" "CURLOPT_POSTQUOTE"
359 ;        "CURLOPT_INTERFACE" "CURLOPT_KRB4LEVEL"
360 ;        "CURLOPT_HTTPPROXYTUNNEL" "CURLOPT_FILETIME"
361 ;        "CURLOPT_WRITEFUNCTION" "CURLOPT_READFUNCTION"
362 ;        "CURLOPT_PASSWDFUNCTION" "CURLOPT_HEADERFUNCTION"
363 ;        "CURLOPT_MAXREDIRS" "CURLOPT_MAXCONNECTS" "CURLOPT_CLOSEPOLICY"
364 ;        "CURLOPT_FRESH_CONNECT" "CURLOPT_FORBID_REUSE"
365 ;        "CURLOPT_RANDOM_FILE" "CURLOPT_EGDSOCKET"
366 ;        "CURLOPT_CONNECTTIMEOUT" "CURLOPT_SSL_VERIFYPEER"
367 ;        "CURLOPT_CAINFO" "CURLOPT_BINARYTRANSER"
368 ;        "CURLCLOSEPOLICY_LEAST_RECENTLY_USED" "CURLCLOSEPOLICY_OLDEST"
369 ;        "CURLINFO_EFFECTIVE_URL" "CURLINFO_HTTP_CODE"
370 ;        "CURLINFO_HEADER_SIZE" "CURLINFO_REQUEST_SIZE"
371 ;        "CURLINFO_TOTAL_TIME" "CURLINFO_NAMELOOKUP_TIME"
372 ;        "CURLINFO_CONNECT_TIME" "CURLINFO_PRETRANSFER_TIME"
373 ;        "CURLINFO_SIZE_UPLOAD" "CURLINFO_SIZE_DOWNLOAD"
374 ;        "CURLINFO_SPEED_DOWNLOAD" "CURLINFO_SPEED_UPLOAD"
375 ;        "CURLINFO_FILETIME" "CURLE_OK" "CURLE_UNSUPPORTED_PROTOCOL"
376 ;        "CURLE_FAILED_INIT" "CURLE_URL_MALFORMAT"
377 ;        "CURLE_URL_MALFORMAT_USER" "CURLE_COULDNT_RESOLVE_PROXY"
378 ;        "CURLE_COULDNT_RESOLVE_HOST" "CURLE_COULDNT_CONNECT"
379 ;        "CURLE_FTP_WEIRD_SERVER_REPLY" "CURLE_FTP_ACCESS_DENIED"
380 ;        "CURLE_FTP_USER_PASSWORD_INCORRECT"
381 ;        "CURLE_FTP_WEIRD_PASS_REPLY" "CURLE_FTP_WEIRD_USER_REPLY"
382 ;        "CURLE_FTP_WEIRD_PASV_REPLY" "CURLE_FTP_WEIRD_227_FORMAT"
383 ;        "CURLE_FTP_CANT_GET_HOST" "CURLE_FTP_CANT_RECONNECT"
384 ;        "CURLE_FTP_COULDNT_SET_BINARY" "CURLE_PARTIAL_FILE"
385 ;        "CURLE_FTP_COULDNT_RETR_FILE" "CURLE_FTP_WRITE_ERROR"
386 ;        "CURLE_FTP_QUOTE_ERROR" "CURLE_HTTP_NOT_FOUND"
387 ;        "CURLE_WRITE_ERROR" "CURLE_MALFORMAT_USER"
388 ;        "CURLE_FTP_COULDNT_STOR_FILE" "CURLE_READ_ERROR"
389 ;        "CURLE_OUT_OF_MEMORY" "CURLE_OPERATION_TIMEOUTED"
390 ;        "CURLE_FTP_COULDNT_SET_ASCII" "CURLE_FTP_PORT_FAILED"
391 ;        "CURLE_FTP_COULDNT_USE_REST" "CURLE_FTP_COULDNT_GET_SIZE"
392 ;        "CURLE_HTTP_RANGE_ERROR" "CURLE_HTTP_POST_ERROR"
393 ;        "CURLE_SSL_CONNECT_ERROR" "CURLE_FTP_BAD_DOWNLOAD_RESUME"
394 ;        "CURLE_FILE_COULDNT_READ_FILE" "CURLE_LDAP_CANNOT_BIND"
395 ;        "CURLE_LDAP_SEARCH_FAILED" "CURLE_LIBRARY_NOT_FOUND"
396 ;        "CURLE_FUNCTION_NOT_FOUND" "CURLE_ABORTED_BY_CALLBACK"
397 ;        "CURLE_BAD_FUNCTION_ARGUMENT" "CURLE_BAD_CALLING_ORDER"
398 ;        "CURLE_HTTP_PORT_FAILED" "CURLE_BAD_PASSWORD_ENTERED"
399 ;        "CURLE_TOO_MANY_REDIRECTS" "CURLE_UNKOWN_TELNET_OPTION"
400 ;        "CURLE_TELNET_OPTION_SYNTAX" "CURLE_ALREADY_COMPLETE"
401 ;        "DBX_MYSQL" "DBX_ODBC" "DBX_PGSQL" "DBX_MSSQL" "DBX_PERSISTENT"
402 ;        "DBX_RESULT_INFO" "DBX_RESULT_INDEX" "DBX_RESULT_ASSOC"
403 ;        "DBX_CMP_TEXT" "DBX_CMP_NUMBER" "XML_ELEMENT_NODE"
404 ;        "XML_ATTRIBUTE_NODE" "XML_TEXT_NODE" "XML_CDATA_SECTION_NODE"
405 ;        "XML_ENTITY_REF_NODE" "XML_ENTITY_NODE" "XML_PI_NODE"
406 ;        "XML_COMMENT_NODE" "XML_DOCUMENT_NODE" "XML_DOCUMENT_TYPE_NODE"
407 ;        "XML_DOCUMENT_FRAG_NODE" "XML_NOTATION_NODE"
408 ;        "XML_HTML_DOCUMENT_NODE" "XML_DTD_NODE" "XML_ELEMENT_DECL_NODE"
409 ;        "XML_ATTRIBUTE_DECL_NODE" "XML_ENTITY_DECL_NODE"
410 ;        "XML_NAMESPACE_DECL_NODE" "XML_GLOBAL_NAMESPACE"
411 ;        "XML_LOCAL_NAMESPACE" "XML_ATTRIBUTE_CDATA" "XML_ATTRIBUTE_ID"
412 ;        "XML_ATTRIBUTE_IDREF" "XML_ATTRIBUTE_IDREFS"
413 ;        "XML_ATTRIBUTE_ENTITY" "XML_ATTRIBUTE_NMTOKEN"
414 ;        "XML_ATTRIBUTE_NMTOKENS" "XML_ATTRIBUTE_ENUMERATION"
415 ;        "XML_ATTRIBUTE_NOTATION" "XPATH_UNDEFINED" "XPATH_NODESET"
416 ;        "XPATH_BOOLEAN" "XPATH_NUMBER" "XPATH_STRING" "XPATH_POINT"
417 ;        "XPATH_RANGE" "XPATH_LOCATIONSET" "XPATH_USERS" "FBSQL_ASSOC"
418 ;        "FBSQL_NUM" "FBSQL_BOTH" "FDFValue" "FDFStatus" "FDFFile"
419 ;        "FDFID" "FDFFf" "FDFSetFf" "FDFClearFf" "FDFFlags" "FDFSetF"
420 ;        "FDFClrF" "FDFAP" "FDFAS" "FDFAction" "FDFAA" "FDFAPRef"
421 ;        "FDFIF" "FDFEnter" "FDFExit" "FDFDown" "FDFUp" "FDFFormat"
422 ;        "FDFValidate" "FDFKeystroke" "FDFCalculate"
423 ;        "FRIBIDI_CHARSET_UTF8" "FRIBIDI_CHARSET_8859_6"
424 ;        "FRIBIDI_CHARSET_8859_8" "FRIBIDI_CHARSET_CP1255"
425 ;        "FRIBIDI_CHARSET_CP1256" "FRIBIDI_CHARSET_ISIRI_3342"
426 ;        "FTP_ASCII" "FTP_BINARY" "FTP_IMAGE" "FTP_TEXT" "IMG_GIF"
427 ;        "IMG_JPG" "IMG_JPEG" "IMG_PNG" "IMG_WBMP" "IMG_COLOR_TILED"
428 ;        "IMG_COLOR_STYLED" "IMG_COLOR_BRUSHED"
429 ;        "IMG_COLOR_STYLEDBRUSHED" "IMG_COLOR_TRANSPARENT"
430 ;        "IMG_ARC_ROUNDED" "IMG_ARC_PIE" "IMG_ARC_CHORD"
431 ;        "IMG_ARC_NOFILL" "IMG_ARC_EDGED" "GMP_ROUND_ZERO"
432 ;        "GMP_ROUND_PLUSINF" "GMP_ROUND_MINUSINF" "HW_ATTR_LANG"
433 ;        "HW_ATTR_NR" "HW_ATTR_NONE" "IIS_READ" "IIS_WRITE"
434 ;        "IIS_EXECUTE" "IIS_SCRIPT" "IIS_ANONYMOUS" "IIS_BASIC"
435 ;        "IIS_NTLM" "NIL" "OP_DEBUG" "OP_READONLY" "OP_ANONYMOUS"
436 ;        "OP_SHORTCACHE" "OP_SILENT" "OP_PROTOTYPE" "OP_HALFOPEN"
437 ;        "OP_EXPUNGE" "OP_SECURE" "CL_EXPUNGE" "FT_UID" "FT_PEEK"
438 ;        "FT_NOT" "FT_INTERNAL" "FT_PREFETCHTEXT" "ST_UID" "ST_SILENT"
439 ;        "ST_SET" "CP_UID" "CP_MOVE" "SE_UID" "SE_FREE" "SE_NOPREFETCH"
440 ;        "SO_FREE" "SO_NOSERVER" "SA_MESSAGES" "SA_RECENT" "SA_UNSEEN"
441 ;        "SA_UIDNEXT" "SA_UIDVALIDITY" "SA_ALL" "LATT_NOINFERIORS"
442 ;        "LATT_NOSELECT" "LATT_MARKED" "LATT_UNMARKED" "SORTDATE"
443 ;        "SORTARRIVAL" "SORTFROM" "SORTSUBJECT" "SORTTO" "SORTCC"
444 ;        "SORTSIZE" "TYPETEXT" "TYPEMULTIPART" "TYPEMESSAGE"
445 ;        "TYPEAPPLICATION" "TYPEAUDIO" "TYPEIMAGE" "TYPEVIDEO"
446 ;        "TYPEOTHER" "ENC7BIT" "ENC8BIT" "ENCBINARY" "ENCBASE64"
447 ;        "ENCQUOTEDPRINTABLE" "ENCOTHER" "INGRES_ASSOC" "INGRES_NUM"
448 ;        "INGRES_BOTH" "IBASE_DEFAULT" "IBASE_TEXT" "IBASE_UNIXTIME"
449 ;        "IBASE_READ" "IBASE_COMMITTED" "IBASE_CONSISTENCY"
450 ;        "IBASE_NOWAIT" "IBASE_TIMESTAMP" "IBASE_DATE" "IBASE_TIME"
451 ;        "LDAP_DEREF_NEVER" "LDAP_DEREF_SEARCHING" "LDAP_DEREF_FINDING"
452 ;        "LDAP_DEREF_ALWAYS" "LDAP_OPT_DEREF" "LDAP_OPT_SIZELIMIT"
453 ;        "LDAP_OPT_TIMELIMIT" "LDAP_OPT_PROTOCOL_VERSION"
454 ;        "LDAP_OPT_ERROR_NUMBER" "LDAP_OPT_REFERRALS" "LDAP_OPT_RESTART"
455 ;        "LDAP_OPT_HOST_NAME" "LDAP_OPT_ERROR_STRING"
456 ;        "LDAP_OPT_MATCHED_DN" "LDAP_OPT_SERVER_CONTROLS"
457 ;        "LDAP_OPT_CLIENT_CONTROLS" "GSLC_SSL_NO_AUTH"
458 ;        "GSLC_SSL_ONEWAY_AUTH" "GSLC_SSL_TWOWAY_AUTH" "MCAL_SUNDAY"
459 ;        "MCAL_MONDAY" "MCAL_TUESDAY" "MCAL_WEDNESDAY" "MCAL_THURSDAY"
460 ;        "MCAL_FRIDAY" "MCAL_SATURDAY" "MCAL_JANUARY" "MCAL_FEBRUARY"
461 ;        "MCAL_MARCH" "MCAL_APRIL" "MCAL_MAY" "MCAL_JUNE" "MCAL_JULY"
462 ;        "MCAL_AUGUST" "MCAL_SEPTEMBER" "MCAL_OCTOBER" "MCAL_NOVEMBER"
463 ;        "MCAL_RECUR_NONE" "MCAL_RECUR_DAILY" "MCAL_RECUR_WEEKLY"
464 ;        "MCAL_RECUR_MONTHLY_MDAY" "MCAL_RECUR_MONTHLY_WDAY"
465 ;        "MCAL_RECUR_YEARLY" "MCAL_M_SUNDAY" "MCAL_M_MONDAY"
466 ;        "MCAL_M_TUESDAY" "MCAL_M_WEDNESDAY" "MCAL_M_THURSDAY"
467 ;        "MCAL_M_FRIDAY" "MCAL_M_SATURDAY" "MCAL_M_WEEKDAYS"
468 ;        "MCAL_M_WEEKEND" "MCAL_M_ALLDAYS" "MCRYPT_" "MCRYPT_"
469 ;        "MCRYPT_ENCRYPT" "MCRYPT_DECRYPT" "MCRYPT_DEV_RANDOM"
470 ;        "MCRYPT_DEV_URANDOM" "MCRYPT_RAND" "SWFBUTTON_HIT"
471 ;        "SWFBUTTON_DOWN" "SWFBUTTON_OVER" "SWFBUTTON_UP"
472 ;        "SWFBUTTON_MOUSEUPOUTSIDE" "SWFBUTTON_DRAGOVER"
473 ;        "SWFBUTTON_DRAGOUT" "SWFBUTTON_MOUSEUP" "SWFBUTTON_MOUSEDOWN"
474 ;        "SWFBUTTON_MOUSEOUT" "SWFBUTTON_MOUSEOVER"
475 ;        "SWFFILL_RADIAL_GRADIENT" "SWFFILL_LINEAR_GRADIENT"
476 ;        "SWFFILL_TILED_BITMAP" "SWFFILL_CLIPPED_BITMAP"
477 ;        "SWFTEXTFIELD_HASLENGTH" "SWFTEXTFIELD_NOEDIT"
478 ;        "SWFTEXTFIELD_PASSWORD" "SWFTEXTFIELD_MULTILINE"
479 ;        "SWFTEXTFIELD_WORDWRAP" "SWFTEXTFIELD_DRAWBOX"
480 ;        "SWFTEXTFIELD_NOSELECT" "SWFTEXTFIELD_HTML"
481 ;        "SWFTEXTFIELD_ALIGN_LEFT" "SWFTEXTFIELD_ALIGN_RIGHT"
482 ;        "SWFTEXTFIELD_ALIGN_CENTER" "SWFTEXTFIELD_ALIGN_JUSTIFY"
483 ;        "UDM_FIELD_URLID" "UDM_FIELD_URL" "UDM_FIELD_CONTENT"
484 ;        "UDM_FIELD_TITLE" "UDM_FIELD_KEYWORDS" "UDM_FIELD_DESC"
485 ;        "UDM_FIELD_DESCRIPTION" "UDM_FIELD_TEXT" "UDM_FIELD_SIZE"
486 ;        "UDM_FIELD_RATING" "UDM_FIELD_SCORE" "UDM_FIELD_MODIFIED"
487 ;        "UDM_FIELD_ORDER" "UDM_FIELD_CRC" "UDM_FIELD_CATEGORY"
488 ;        "UDM_PARAM_PAGE_SIZE" "UDM_PARAM_PAGE_NUM"
489 ;        "UDM_PARAM_SEARCH_MODE" "UDM_PARAM_CACHE_MODE"
490 ;        "UDM_PARAM_TRACK_MODE" "UDM_PARAM_PHRASE_MODE"
491 ;        "UDM_PARAM_CHARSET" "UDM_PARAM_STOPTABLE"
492 ;        "UDM_PARAM_STOP_TABLE" "UDM_PARAM_STOPFILE"
493 ;        "UDM_PARAM_STOP_FILE" "UDM_PARAM_WEIGHT_FACTOR"
494 ;        "UDM_PARAM_WORD_MATCH" "UDM_PARAM_MAX_WORD_LEN"
495 ;        "UDM_PARAM_MAX_WORDLEN" "UDM_PARAM_MIN_WORD_LEN"
496 ;        "UDM_PARAM_MIN_WORDLEN" "UDM_PARAM_ISPELL_PREFIXES"
497 ;        "UDM_PARAM_ISPELL_PREFIX" "UDM_PARAM_PREFIXES"
498 ;        "UDM_PARAM_PREFIX" "UDM_PARAM_CROSS_WORDS"
499 ;        "UDM_PARAM_CROSSWORDS" "UDM_LIMIT_CAT" "UDM_LIMIT_URL"
500 ;        "UDM_LIMIT_TAG" "UDM_LIMIT_LANG" "UDM_LIMIT_DATE"
501 ;        "UDM_PARAM_FOUND" "UDM_PARAM_NUM_ROWS" "UDM_PARAM_WORDINFO"
502 ;        "UDM_PARAM_WORD_INFO" "UDM_PARAM_SEARCHTIME"
503 ;        "UDM_PARAM_SEARCH_TIME" "UDM_PARAM_FIRST_DOC"
504 ;        "UDM_PARAM_LAST_DOC" "UDM_MODE_ALL" "UDM_MODE_ANY"
505 ;        "UDM_MODE_BOOL" "UDM_MODE_PHRASE" "UDM_CACHE_ENABLED"
506 ;        "UDM_CACHE_DISABLED" "UDM_TRACK_ENABLED" "UDM_TRACK_DISABLED"
507 ;        "UDM_PHRASE_ENABLED" "UDM_PHRASE_DISABLED"
508 ;        "UDM_CROSS_WORDS_ENABLED" "UDM_CROSSWORDS_ENABLED"
509 ;        "UDM_CROSS_WORDS_DISABLED" "UDM_CROSSWORDS_DISABLED"
510 ;        "UDM_PREFIXES_ENABLED" "UDM_PREFIX_ENABLED"
511 ;        "UDM_ISPELL_PREFIXES_ENABLED" "UDM_ISPELL_PREFIX_ENABLED"
512 ;        "UDM_PREFIXES_DISABLED" "UDM_PREFIX_DISABLED"
513 ;        "UDM_ISPELL_PREFIXES_DISABLED" "UDM_ISPELL_PREFIX_DISABLED"
514 ;        "UDM_ISPELL_TYPE_AFFIX" "UDM_ISPELL_TYPE_SPELL"
515 ;        "UDM_ISPELL_TYPE_DB" "UDM_ISPELL_TYPE_SERVER" "UDM_MATCH_WORD"
516 ;        "UDM_MATCH_BEGIN" "UDM_MATCH_SUBSTR" "UDM_MATCH_END"
517 ;        "MSQL_ASSOC" "MSQL_NUM" "MSQL_BOTH" "MYSQL_ASSOC" "MYSQL_NUM"
518 ;        "MYSQL_BOTH" "MYSQL_USE_RESULT" "MYSQL_STORE_RESULT"
519 ;        "OCI_DEFAULT" "OCI_DESCRIBE_ONLY" "OCI_COMMIT_ON_SUCCESS"
520 ;        "OCI_EXACT_FETCH" "SQLT_BFILEE" "SQLT_CFILEE" "SQLT_CLOB"
521 ;        "SQLT_BLOB" "SQLT_RDD" "OCI_B_SQLT_NTY" "OCI_SYSDATE"
522 ;        "OCI_B_BFILE" "OCI_B_CFILEE" "OCI_B_CLOB" "OCI_B_BLOB"
523 ;        "OCI_B_ROWID" "OCI_B_CURSOR" "OCI_B_BIN" "OCI_ASSOC" "OCI_NUM"
524 ;        "OCI_BOTH" "OCI_RETURN_NULLS" "OCI_RETURN_LOBS"
525 ;        "OCI_DTYPE_FILE" "OCI_DTYPE_LOB" "OCI_DTYPE_ROWID" "OCI_D_FILE"
526 ;        "OCI_D_LOB" "OCI_D_ROWID" "ODBC_TYPE" "ODBC_BINMODE_PASSTHRU"
527 ;        "ODBC_BINMODE_RETURN" "ODBC_BINMODE_CONVERT" "SQL_ODBC_CURSORS"
528 ;        "SQL_CUR_USE_DRIVER" "SQL_CUR_USE_IF_NEEDED" "SQL_CUR_USE_ODBC"
529 ;        "SQL_CONCURRENCY" "SQL_CONCUR_READ_ONLY" "SQL_CONCUR_LOCK"
530 ;        "SQL_CONCUR_ROWVER" "SQL_CONCUR_VALUES" "SQL_CURSOR_TYPE"
531 ;        "SQL_CURSOR_FORWARD_ONLY" "SQL_CURSOR_KEYSET_DRIVEN"
532 ;        "SQL_CURSOR_DYNAMIC" "SQL_CURSOR_STATIC" "SQL_KEYSET_SIZE"
533 ;        "SQL_CHAR" "SQL_VARCHAR" "SQL_LONGVARCHAR" "SQL_DECIMAL"
534 ;        "SQL_NUMERIC" "SQL_BIT" "SQL_TINYINT" "SQL_SMALLINT"
535 ;        "SQL_INTEGER" "SQL_BIGINT" "SQL_REAL" "SQL_FLOAT" "SQL_DOUBLE"
536 ;        "SQL_BINARY" "SQL_VARBINARY" "SQL_LONGVARBINARY" "SQL_DATE"
537 ;        "SQL_TIME" "SQL_TIMESTAMP" "SQL_TYPE_DATE" "SQL_TYPE_TIME"
538 ;        "SQL_TYPE_TIMESTAMP" "SQL_BEST_ROWID" "SQL_ROWVER"
539 ;        "SQL_SCOPE_CURROW" "SQL_SCOPE_TRANSACTION" "SQL_SCOPE_SESSION"
540 ;        "SQL_NO_NULLS" "SQL_NULLABLE" "SQL_INDEX_UNIQUE"
541 ;        "SQL_INDEX_ALL" "SQL_ENSURE" "SQL_QUICK"
542 ;        "X509_PURPOSE_SSL_CLIENT" "X509_PURPOSE_SSL_SERVER"
543 ;        "X509_PURPOSE_NS_SSL_SERVER" "X509_PURPOSE_SMIME_SIGN"
544 ;        "X509_PURPOSE_SMIME_ENCRYPT" "X509_PURPOSE_CRL_SIGN"
545 ;        "X509_PURPOSE_ANY" "PKCS7_DETACHED" "PKCS7_TEXT"
546 ;        "PKCS7_NOINTERN" "PKCS7_NOVERIFY" "PKCS7_NOCHAIN"
547 ;        "PKCS7_NOCERTS" "PKCS7_NOATTR" "PKCS7_BINARY" "PKCS7_NOSIGS"
548 ;        "OPENSSL_PKCS1_PADDING" "OPENSSL_SSLV23_PADDING"
549 ;        "OPENSSL_NO_PADDING" "OPENSSL_PKCS1_OAEP_PADDING"
550 ;        "ORA_BIND_INOUT" "ORA_BIND_IN" "ORA_BIND_OUT"
551 ;        "ORA_FETCHINTO_ASSOC" "ORA_FETCHINTO_NULLS"
552 ;        "PREG_PATTERN_ORDER" "PREG_SET_ORDER" "PREG_SPLIT_NO_EMPTY"
553 ;        "PREG_SPLIT_DELIM_CAPTURE" "PGSQL_ASSOC" "PGSQL_NUM"
554 ;        "PGSQL_BOTH" "PRINTER_COPIES" "PRINTER_MODE" "PRINTER_TITLE"
555 ;        "PRINTER_DEVICENAME" "PRINTER_DRIVERVERSION"
556 ;        "PRINTER_RESOLUTION_Y" "PRINTER_RESOLUTION_X" "PRINTER_SCALE"
557 ;        "PRINTER_BACKGROUND_COLOR" "PRINTER_PAPER_LENGTH"
558 ;        "PRINTER_PAPER_WIDTH" "PRINTER_PAPER_FORMAT"
559 ;        "PRINTER_FORMAT_CUSTOM" "PRINTER_FORMAT_LETTER"
560 ;        "PRINTER_FORMAT_LEGAL" "PRINTER_FORMAT_A3" "PRINTER_FORMAT_A4"
561 ;        "PRINTER_FORMAT_A5" "PRINTER_FORMAT_B4" "PRINTER_FORMAT_B5"
562 ;        "PRINTER_FORMAT_FOLIO" "PRINTER_ORIENTATION"
563 ;        "PRINTER_ORIENTATION_PORTRAIT" "PRINTER_ORIENTATION_LANDSCAPE"
564 ;        "PRINTER_TEXT_COLOR" "PRINTER_TEXT_ALIGN" "PRINTER_TA_BASELINE"
565 ;        "PRINTER_TA_BOTTOM" "PRINTER_TA_TOP" "PRINTER_TA_CENTER"
566 ;        "PRINTER_TA_LEFT" "PRINTER_TA_RIGHT" "PRINTER_PEN_SOLID"
567 ;        "PRINTER_PEN_DASH" "PRINTER_PEN_DOT" "PRINTER_PEN_DASHDOT"
568 ;        "PRINTER_PEN_DASHDOTDOT" "PRINTER_PEN_INVISIBLE"
569 ;        "PRINTER_BRUSH_SOLID" "PRINTER_BRUSH_CUSTOM"
570 ;        "PRINTER_BRUSH_DIAGONAL" "PRINTER_BRUSH_CROSS"
571 ;        "PRINTER_BRUSH_DIAGCROSS" "PRINTER_BRUSH_FDIAGONAL"
572 ;        "PRINTER_BRUSH_HORIZONTAL" "PRINTER_BRUSH_VERTICAL"
573 ;        "PRINTER_FW_THIN" "PRINTER_FW_ULTRALIGHT" "PRINTER_FW_LIGHT"
574 ;        "PRINTER_FW_NORMAL" "PRINTER_FW_MEDIUM" "PRINTER_FW_BOLD"
575 ;        "PRINTER_FW_ULTRABOLD" "PRINTER_FW_HEAVY" "PRINTER_ENUM_LOCAL"
576 ;        "PRINTER_ENUM_NAME" "PRINTER_ENUM_SHARED"
577 ;        "PRINTER_ENUM_DEFAULT" "PRINTER_ENUM_CONNECTIONS"
578 ;        "PRINTER_ENUM_NETWORK" "PRINTER_ENUM_REMOTE" "PSPELL_FAST"
579 ;        "PSPELL_NORMAL" "PSPELL_BAD_SPELLERS" "PSPELL_RUN_TOGETHER"
580 ;        "SID" "SID" "AF_UNIX" "AF_INET" "SOCK_STREAM" "SOCK_DGRAM"
581 ;        "SOCK_RAW" "SOCK_SEQPACKET" "SOCK_RDM" "MSG_OOB" "MSG_WAITALL"
582 ;        "MSG_PEEK" "MSG_DONTROUTE" "SO_DEBUG" "SO_REUSEADDR"
583 ;        "SO_KEEPALIVE" "SO_DONTROUTE" "SO_LINGER" "SO_BROADCAST"
584 ;        "SO_OOBINLINE" "SO_SNDBUF" "SO_RCVBUF" "SO_SNDLOWAT"
585 ;        "SO_RCVLOWAT" "SO_SNDTIMEO" "SO_RCVTIMEO" "SO_TYPE" "SO_ERROR"
586 ;        "SOL_SOCKET" "PHP_NORMAL_READ" "PHP_BINARY_READ"
587 ;        "PHP_SYSTEM_READ" "SOL_TCP" "SOL_UDP" "MOD_COLOR" "MOD_MATRIX"
588 ;        "TYPE_PUSHBUTTON" "TYPE_MENUBUTTON" "BSHitTest" "BSDown"
589 ;        "BSOver" "BSUp" "OverDowntoIdle" "IdletoOverDown"
590 ;        "OutDowntoIdle" "OutDowntoOverDown" "OverDowntoOutDown"
591 ;        "OverUptoOverDown" "OverUptoIdle" "IdletoOverUp" "ButtonEnter"
592 ;        "ButtonExit" "MenuEnter" "MenuExit" "XML_ERROR_NONE"
593 ;        "XML_ERROR_NO_MEMORY" "XML_ERROR_SYNTAX"
594 ;        "XML_ERROR_NO_ELEMENTS" "XML_ERROR_INVALID_TOKEN"
595 ;        "XML_ERROR_UNCLOSED_TOKEN" "XML_ERROR_PARTIAL_CHAR"
596 ;        "XML_ERROR_TAG_MISMATCH" "XML_ERROR_DUPLICATE_ATTRIBUTE"
597 ;        "XML_ERROR_JUNK_AFTER_DOC_ELEMENT" "XML_ERROR_PARAM_ENTITY_REF"
598 ;        "XML_ERROR_UNDEFINED_ENTITY" "XML_ERROR_RECURSIVE_ENTITY_REF"
599 ;        "XML_ERROR_ASYNC_ENTITY" "XML_ERROR_BAD_CHAR_REF"
600 ;        "XML_ERROR_BINARY_ENTITY_REF"
601 ;        "XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF"
602 ;        "XML_ERROR_MISPLACED_XML_PI" "XML_ERROR_UNKNOWN_ENCODING"
603 ;        "XML_ERROR_INCORRECT_ENCODING"
604 ;        "XML_ERROR_UNCLOSED_CDATA_SECTION"
605 ;        "XML_ERROR_EXTERNAL_ENTITY_HANDLING" "XML_OPTION_CASE_FOLDING"
606 ;        "XML_OPTION_TARGET_ENCODING" "XML_OPTION_SKIP_TAGSTART"
607 ;        "XML_OPTION_SKIP_WHITE" "YPERR_BADARGS" "YPERR_BADDB"
608 ;        "YPERR_BUSY" "YPERR_DOMAIN" "YPERR_KEY" "YPERR_MAP"
609 ;        "YPERR_NODOM" "YPERR_NOMORE" "YPERR_PMAP" "YPERR_RESRC"
610 ;        "YPERR_RPC" "YPERR_YPBIND" "YPERR_YPERR" "YPERR_YPSERV"
611 ;        "YPERR_VERS" "FORCE_GZIP" "FORCE_DEFLATE"
612
613        ;; PEAR constants
614 ;        "PEAR_ERROR_RETURN" "PEAR_ERROR_PRINT" "PEAR_ERROR_TRIGGER"
615 ;        "PEAR_ERROR_DIE" "PEAR_ERROR_CALLBACK" "OS_WINDOWS" "OS_UNIX"
616 ;        "PEAR_OS" "DB_OK" "DB_ERROR" "DB_ERROR_SYNTAX"
617 ;        "DB_ERROR_CONSTRAINT" "DB_ERROR_NOT_FOUND"
618 ;        "DB_ERROR_ALREADY_EXISTS" "DB_ERROR_UNSUPPORTED"
619 ;        "DB_ERROR_MISMATCH" "DB_ERROR_INVALID" "DB_ERROR_NOT_CAPABLE"
620 ;        "DB_ERROR_TRUNCATED" "DB_ERROR_INVALID_NUMBER"
621 ;        "DB_ERROR_INVALID_DATE" "DB_ERROR_DIVZERO"
622 ;        "DB_ERROR_NODBSELECTED" "DB_ERROR_CANNOT_CREATE"
623 ;        "DB_ERROR_CANNOT_DELETE" "DB_ERROR_CANNOT_DROP"
624 ;        "DB_ERROR_NOSUCHTABLE" "DB_ERROR_NOSUCHFIELD"
625 ;        "DB_ERROR_NEED_MORE_DATA" "DB_ERROR_NOT_LOCKED"
626 ;        "DB_ERROR_VALUE_COUNT_ON_ROW" "DB_ERROR_INVALID_DSN"
627 ;        "DB_ERROR_CONNECT_FAILED" "DB_WARNING" "DB_WARNING_READ_ONLY"
628 ;        "DB_PARAM_SCALAR" "DB_PARAM_OPAQUE" "DB_BINMODE_PASSTHRU"
629 ;        "DB_BINMODE_RETURN" "DB_BINMODE_CONVERT" "DB_FETCHMODE_DEFAULT"
630 ;        "DB_FETCHMODE_ORDERED" "DB_FETCHMODE_ASSOC"
631 ;        "DB_FETCHMODE_FLIPPED" "DB_GETMODE_ORDERED" "DB_GETMODE_ASSOC"
632 ;        "DB_GETMODE_FLIPPED" "DB_TABLEINFO_ORDER"
633 ;        "DB_TABLEINFO_ORDERTABLE" "DB_TABLEINFO_FULL"
634        
635        )))
636   "PHP constants.")
637
638 (defconst php-keywords
639   (eval-when-compile
640     (regexp-opt
641      ;; "class", "new" and "extends" get special treatment
642      ;; "case" and  "default" get special treatment elsewhere
643      '("and" "as" "break" "continue" "declare" "do" "echo" "else" "elseif"
644        "endfor" "endforeach" "endif" "endswitch" "endwhile" "exit"
645        "extends" "for" "foreach" "global" "if" "include" "include_once"
646        "next" "or" "require" "require_once" "return" "static" "switch"
647        "then" "var" "while" "xor" "private" "throw" "catch" "try" 
648        "instanceof" "catch all" "finally")))
649   "PHP keywords.")
650
651 (defconst php-identifier
652   (eval-when-compile
653     '"[a-zA-Z\_\x7f-\xff][a-zA-Z0-9\_\x7f-\xff]*")
654   "Characters in a PHP identifier.")
655
656 (defconst php-types
657   (eval-when-compile
658     (regexp-opt '("array" "bool" "boolean" "char" "const" "double" "float"
659                   "int" "integer" "long" "mixed" "object" "real" 
660                   "string")))
661   "PHP types.")
662
663 (defconst php-superglobals
664   (eval-when-compile
665     (regexp-opt '("_GET" "_POST" "_COOKIE" "_SESSION" "_ENV" "GLOBALS"
666                   "_SERVER" "_FILES" "_REQUEST")))
667   "PHP superglobal variables.")
668
669 ;; Set up font locking
670 (defconst php-font-lock-keywords-1
671   (list
672    ;; Fontify constants
673    (cons
674     (concat "\\<\\(" php-constants "\\)\\>")
675     'font-lock-constant-face)
676    
677    ;; Fontify keywords
678    (cons
679     (concat "\\<\\(" php-keywords "\\)\\>")
680     'font-lock-keyword-face)
681    
682    ;; Fontify keywords and targets, and case default tags.
683    (list "\\<\\(break\\|case\\|continue\\)\\>[ \t]*\\(-?\\(?:\\sw\\|\\s_\\)+\\)?"
684          '(1 font-lock-keyword-face) '(2 font-lock-constant-face t t))
685    ;; This must come after the one for keywords and targets.
686    '(":" ("^[ \t]*\\(\\(?:\\sw\\|\\s_\\)+\\)[ \t]*:[ \t]*$"
687           (beginning-of-line) (end-of-line)
688           (1 font-lock-constant-face)))
689    
690    ;; treat 'print' as keyword only when not used like a function name
691    '("\\<print\\s-*(" . default)
692    '("\\<print\\>" . font-lock-keyword-face)
693    
694    ;; Fontify PHP tag
695    '("<\\?\\(php\\)?" . font-lock-constant-face)
696    '("\\?>" . font-lock-constant-face)
697    
698    ;; Fontify ASP-style tag
699    '("<\\%\\(=\\)?" . font-lock-constant-face)
700    '("\\%>" . font-lock-constant-face)
701
702    )
703   "Subdued level highlighting for PHP mode.")
704
705 (defconst php-font-lock-keywords-2
706   (append
707    php-font-lock-keywords-1
708    (list
709     
710     ;; class declaration
711     '("\\<\\(class\\|interface\\)[ \t]*\\(\\(?:\\sw\\|\\s_\\)+\\)?"
712       (1 font-lock-keyword-face) (2 font-lock-type-face nil t))
713     ;; handle several words specially, to include following word,
714     ;; thereby excluding it from unknown-symbol checks later
715     ;; FIX to handle implementing multiple
716     ;; currently breaks on "class Foo implements Bar, Baz"
717     '("\\<\\(new\\|extends\\|implements\\)\\s-+\\$?\\(\\(?:\\sw\\|\\s_\\)+\\)"
718       (1 font-lock-keyword-face) (2 font-lock-type-face))
719
720     ;; function declaration
721     '("\\<\\(function\\)\\s-+&?\\(\\(?:\\sw\\|\\s_\\)+\\)\\s-*("
722       (1 font-lock-keyword-face)
723       (2 font-lock-function-name-face nil t))
724     
725     ;; class hierarchy
726     '("\\(self\\|parent\\)\\W" (1 font-lock-constant-face nil nil))
727
728     ;; method and variable features
729     '("\\<\\(private\\|protected\\|public\\)\\s-+\\$?\\(?:\\sw\\|\\s_\\)+"
730       (1 font-lock-keyword-face))
731
732     ;; method features
733     '("^[ \t]*\\(abstract\\|static\\|final\\)\\s-+\\$?\\(?:\\sw\\|\\s_\\)+"
734       (1 font-lock-keyword-face))
735
736     ;; variable features
737     '("^[ \t]*\\(static\\|const\\)\\s-+\\$?\\(?:\\sw\\|\\s_\\)+"
738       (1 font-lock-keyword-face))
739     ))
740   "Medium level highlighting for PHP mode.")
741
742 (defconst php-font-lock-keywords-3
743   (append
744    php-font-lock-keywords-2
745    (list
746     
747     ;; <word> or </word> for HTML
748     '("</?\\sw+[^>]*>" . font-lock-constant-face)
749
750     ;; HTML entities
751     '("&\\w+;" . font-lock-variable-name-face)
752
753     ;; warn about '$' immediately after ->
754     '("\\$\\(?:\\sw\\|\\s_\\)+->\\s-*\\(\\$\\)\\(\\(?:\\sw\\|\\s_\\)+\\)"
755       (1 font-lock-warning-face) (2 default))
756     
757     ;; warn about $word.word -- it could be a valid concatenation,
758     ;; but without any spaces we'll assume $word->word was meant.
759     '("\\$\\(?:\\sw\\|\\s_\\)+\\(\\.\\)\\sw"
760       1 font-lock-warning-face)
761     
762     ;; Warn about ==> instead of =>
763     '("==+>" . font-lock-warning-face)
764     
765     ;; exclude casts from bare-word treatment (may contain spaces)
766     `(,(concat "(\\s-*\\(" php-types "\\)\\s-*)")
767       1 font-lock-type-face)
768     
769     ;; PHP5: function declarations may contain classes as parameters type
770     `(,(concat "[(,]\\s-*\\(\\(?:\\sw\\|\\s_\\)+\\)\\s-+\\$\\(?:\\sw\\|\\s_\\)+\\>")
771       1 font-lock-type-face)
772     
773     ;; Fontify variables and function calls
774     '("\\$\\(this\\|that\\)\\W" (1 font-lock-constant-face nil nil))
775     `(,(concat "\\$\\(" php-superglobals "\\)\\W")
776       (1 font-lock-constant-face nil nil)) ; $_GET & co
777     '("\\$\\(\\(?:\\sw\\|\\s_\\)+\\)" (1 font-lock-variable-name-face)) ; $variable
778     '("->\\(\\(?:\\sw\\|\\s_\\)+\\)" (1 font-lock-variable-name-face t t)) ; ->variable
779     '("->\\(\\(?:\\sw\\|\\s_\\)+\\)\\s-*(" . (1 default t t)) ; ->function_call
780     '("\\(?:\\sw\\|\\s_\\)+::\\(?:\\sw\\|\\s_\\)+\\s-*(" . default) ; class::method call
781     '("\\<\\(?:\\sw\\|\\s_\\)+\\s-*[[(]" . default)     ; word( or word[
782     '("\\<[0-9]+" . default)            ; number (also matches word)
783
784     ;; Warn on any words not already fontified
785     '("\\<\\(?:\\sw\\|\\s_\\)+\\>" . font-lock-warning-face)
786     ))
787   "Gauchy level highlighting for PHP mode.")
788
789 (defconst php-font-lock-syntactic-keywords
790   (if xemacsp nil
791     ;; Mark shell-style comments.  font-lock handles this in a
792     ;; separate pass from normal syntactic scanning (somehow), so we
793     ;; get a chance to mark these in addition to C and C++ style
794     ;; comments.  This only works in GNU Emacs, not XEmacs 21 which
795     ;; seems to ignore this same code if we try to use it.
796     (list
797      ;; Mark _all_ # chars as being comment-start.  That will be
798      ;; ignored when inside a quoted string.
799      '("\\(\#\\)"
800        (1 (11 . nil)))
801      ;; Mark all newlines ending a line with # as being comment-end.
802      ;; This causes a problem, premature end-of-comment, when '#'
803      ;; appears inside a multiline C-style comment.  Oh well.
804      '("#.*\\([\n]\\)"
805        (1 (12 . nil)))
806      )))
807
808 ;; Define the imenu-generic-expression for PHP mode.
809 ;; To use, execute M-x imenu, then click on Functions or Classes,
810 ;; then select given function/class name to go to its definition.
811 ;; [Contributed by Gerrit Riessen]
812 (defvar php-imenu-generic-expression
813  '(
814    ("Functions"
815     "^\\s-*function\\s-+\\([a-zA-Z0-9_]+\\)\\s-*(" 1)
816    ("Classes"
817     "^\\s-*class\\s-+\\([a-zA-Z0-9_]+\\)\\s-*" 1)
818    )
819  "Imenu generic expression for PHP Mode. See `imenu-generic-expression'."
820  )
821
822 ;; Add "foreach" to conditional introducing keywords
823 (defconst php-conditional-key nil)
824 (let ((all-kws "for\\|if\\|do\\|else\\|while\\|switch\\|foreach\\|elseif\\|try\\|finally\\|try\\|catch all")
825       (front   "\\<\\(")
826       (back    "\\)\\>[^_]"))
827   (setq php-conditional-key (concat front all-kws back)))
828
829 (defconst php-class-kwds "class\\|interface")
830
831 (defconst php-class-key
832   (concat
833    "\\(" php-class-kwds "\\)\\s +"
834    c-symbol-key                               ;name of the class
835    "\\(\\s *extends\\s *" c-symbol-key "\\)?" ;maybe followed by superclass
836    "\\(\\s *implements *[^{]+{\\)?"           ;maybe the adopted protocols list
837    ))
838
839 ;; Create "default" symbol for GNU Emacs so that both XEmacs and GNU
840 ;; emacs can refer to the default face by a variable named "default".
841 (unless (boundp 'default)
842   (defvar default 'default))
843
844 ;; Create faces for XEmacs
845 (unless (boundp 'font-lock-keyword-face)
846   (copy-face 'bold 'font-lock-keyword-face))
847 (unless (boundp 'font-lock-constant-face)
848   (copy-face 'font-lock-keyword-face 'font-lock-constant-face))
849
850 (provide 'php-mode)
851
852 ;;; php-mode.el ends here