emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/php-mode 651d524bdb 1/9: Add script/extract_functions.php


From: ELPA Syncer
Subject: [nongnu] elpa/php-mode 651d524bdb 1/9: Add script/extract_functions.php
Date: Sat, 1 Oct 2022 23:59:02 -0400 (EDT)

branch: elpa/php-mode
commit 651d524bdbf4083ea35e1b1db4cbf0d090cd595f
Author: USAMI Kenta <tadsan@zonu.me>
Commit: USAMI Kenta <tadsan@zonu.me>

    Add script/extract_functions.php
---
 .gitignore                         |   1 +
 script/README.md                   |  40 ++
 script/data/module_id_prefixes.php | 846 +++++++++++++++++++++++++++++++++++++
 script/extract_functions.php       | 111 +++++
 script/module_id_prefixes.php      | 806 +++++++++++++++++++++++++++++++++++
 5 files changed, 1804 insertions(+)

diff --git a/.gitignore b/.gitignore
index 783efce946..f1e2797e02 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@
 /.keg/*
 /.php-cs-fixer.cache
 php-mode-autoloads.el
+php_manual_en.json
diff --git a/script/README.md b/script/README.md
new file mode 100644
index 0000000000..e9406e742b
--- /dev/null
+++ b/script/README.md
@@ -0,0 +1,40 @@
+
+# Maintenance script for PHP Mode
+
+These scripts are provided for maintenance of PHP Mode.
+
+## Extract PHP Functions
+
+This script extract PHP function names from 
<http://doc.php.net/downloads/json/php_manual_en.json>.
+
+### Usage
+
+```
+Usage:
+       ./script/extract_functions.php count < php_manual_en.json
+       ./script/extract_functions.php modules < php_manual_en.json
+       ./script/extract_functions.php functions < php_manual_en.json > 
result.json
+       ./script/extract_functions.php functions-sexp < php_manual_en.json > 
result.el
+```
+
+### Data
+
+A pattern for grouping function modules by function-id is written in 
`data/module_id_prefixes.php`.
+
+ * All entries are combined as prefix matching patterns
+ * The meanings of `.` and `\.` (matches) in the regular expression are swapped
+   * `\.` matches any one character
+   * `.` matches only `"."`
+ * An alphanumeric-terminated entry requires an exact match
+   * Other entries require a [`\b`(word 
boundary)](https://www.php.net/manual/regexp.reference.escape.php) at the end
+
+```php
+return [
+    'apache' => [
+        'function.apache-', // matches all "apache-" prefixed IDs
+        'function.virtual', // matches only "function.virtual"
+    ],
+    'bcmath' => [
+        'function.bc\.+',   // matches "function.bcadd", "function.bccomp", 
...etc
+    ],
+```
diff --git a/script/data/module_id_prefixes.php 
b/script/data/module_id_prefixes.php
new file mode 100644
index 0000000000..cef2a14a41
--- /dev/null
+++ b/script/data/module_id_prefixes.php
@@ -0,0 +1,846 @@
+<?php
+
+/**
+ * Classify function modules by function-id
+ *
+ * @copyright 2022 Friends of Emacs-PHP development
+ * @author USAMI Kenta <tadsan@zonu.me>
+ * @license FSFAP https://spdx.org/licenses/FSFAP.html
+ */
+
+// Copying and distribution of this file, with or without modification,
+// are permitted in any medium without royalty provided the copyright
+// notice and this notice are preserved.  This file is offered as-is,
+// without any warranty.
+
+return [
+    'apache' => [
+        'function.apache-',
+        'function.virtual',
+    ],
+    'apcu' => [
+        'function.apcu-',
+    ],
+    'bcmath' => [
+        'function.bc\.+',
+    ],
+    'bzip2' => [
+        'function.bz\.+',
+    ],
+    'calendar' => [
+        'function.cal-',
+        'function.easter-date',
+        'function.easter-days',
+        'function.frenchtojd',
+        'function.gregoriantojd',
+        'function.jddayofweek',
+        'function.jdmonthname',
+        'function.jdtofrench',
+        'function.jdtogregorian',
+        'function.jdtojewish',
+        'function.jdtojulian',
+        'function.jdtounix',
+        'function.jewishtojd',
+        'function.unixtojd',
+    ],
+    'commonmark' => [
+        'function.commonmark-',
+    ],
+    'com_dotnet' => [
+        'function.com-',
+        'function.variant-',
+    ],
+    'componere' => [
+        'componere.',
+    ],
+    'core' => [
+        'function.abs',
+        'function.acos',
+        'function.acosh',
+        'function.addcslashes',
+        'function.addslashes',
+        'function.array-',
+        'function.arsort',
+        'function.asin',
+        'function.asinh',
+        'function.asort',
+        'function.assert-options',
+        'function.atan',
+        'function.atan2',
+        'function.atanh',
+        'function.base-convert',
+        'function.base64-',
+        'function.basename',
+        'function.bin2hex',
+        'function.bindec',
+        'function.boolval',
+        'function.call-user-func',
+        'function.call-user-func-array',
+        'function.ceil',
+        'function.chdir',
+        'function.checkdate',
+        'function.checkdnsrr',
+        'function.chgrp',
+        'function.chmod',
+        'function.chop',
+        'function.chown',
+        'function.chr',
+        'function.chroot',
+        'function.chunk-split',
+        'function.class-alias',
+        'function.class-exists',
+        'function.class-implements',
+        'function.class-parents',
+        'function.class-uses',
+        'function.clearstatcache',
+        'function.cli-',
+        'function.closedir',
+        'function.closelog',
+        'function.compact',
+        'function.connection-',
+        'function.constant',
+        'function.convert-cyr-string',
+        'function.convert-uudecode',
+        'function.convert-uuencode',
+        'function.copy',
+        'function.cos',
+        'function.cosh',
+        'function.count',
+        'function.count-chars',
+        'function.crc32',
+        'function.create-function',
+        'function.crypt',
+        'function.ctype-',
+        'function.current',
+        'function.date',
+        'function.date-',
+        'function.debug-',
+        'function.decbin',
+        'function.dechex',
+        'function.decoct',
+        'function.define',
+        'function.defined',
+        'function.deg2rad',
+        'function.delete',
+        'function.die',
+        'function.dir',
+        'function.dirname',
+        'function.disk-',
+        'function.diskfreespace',
+        'function.dl',
+        'function.dns-check-record',
+        'function.dns-get-mx',
+        'function.dns-get-record',
+        'function.doubleval',
+        'function.each',
+        'function.enum-exists',
+        'function.error-',
+        'function.escapeshellarg',
+        'function.escapeshellcmd',
+        'function.eval',
+        'function.exec',
+        'function.exit',
+        'function.exp',
+        'function.explode',
+        'function.expm1',
+        'function.extension-loaded',
+        'function.extract',
+        'function.fastcgi-',
+        'function.fclose',
+        'function.fdatasync',
+        'function.fdiv',
+        'function.feof',
+        'function.fflush',
+        'function.fgetc',
+        'function.fgetcsv',
+        'function.fgets',
+        'function.fgetss',
+        'function.file',
+        'function.file\.+',
+        'function.filter-',
+        'function.finfo-',
+        'function.floatval',
+        'function.flock',
+        'function.floor',
+        'function.flush',
+        'function.fmod',
+        'function.fnmatch',
+        'function.fopen',
+        'function.forward-static-call',
+        'function.forward-static-call-array',
+        'function.fpassthru',
+        'function.fprintf',
+        'function.fputcsv',
+        'function.fputs',
+        'function.fread',
+        'function.fscanf',
+        'function.fseek',
+        'function.fsockopen',
+        'function.fstat',
+        'function.fsync',
+        'function.ftell',
+        'function.ftruncate',
+        'function.func-get-arg',
+        'function.func-get-args',
+        'function.func-num-args',
+        'function.function-exists',
+        'function.fwrite',
+        'function.gc-',
+        'function.get-',
+        'function.getallheaders',
+        'function.getcwd',
+        'function.getdate',
+        'function.getenv',
+        'function.gethostbyaddr',
+        'function.gethostbyname',
+        'function.gethostbynamel',
+        'function.gethostname',
+        'function.getlastmod',
+        'function.getmxrr',
+        'function.getmygid',
+        'function.getmyinode',
+        'function.getmypid',
+        'function.getmyuid',
+        'function.getopt',
+        'function.getprotobyname',
+        'function.getprotobynumber',
+        'function.getrandmax',
+        'function.getrusage',
+        'function.getservbyname',
+        'function.getservbyport',
+        'function.gettimeofday',
+        'function.gettype',
+        'function.glob',
+        'function.gmdate',
+        'function.gmmktime',
+        'function.gmstrftime',
+        'function.hash',
+        'function.hash-',
+        'function.header',
+        'function.header-register-callback',
+        'function.header-remove',
+        'function.headers-list',
+        'function.headers-sent',
+        'function.hebrev',
+        'function.hebrevc',
+        'function.hex2bin',
+        'function.hexdec',
+        'function.highlight-file',
+        'function.highlight-string',
+        'function.hrtime',
+        'function.html-entity-decode',
+        'function.htmlentities',
+        'function.htmlspecialchars',
+        'function.htmlspecialchars-decode',
+        'function.http-build-query',
+        'function.http-response-code',
+        'function.hypot',
+        'function.idate',
+        'function.ignore-user-abort',
+        'function.implode',
+        'function.in-array',
+        'function.inet-',
+        'function.ini-',
+        'function.intdiv',
+        'function.interface-exists',
+        'function.intval',
+        'function.ip2long',
+        'function.is-a',
+        'function.is-array',
+        'function.is-bool',
+        'function.is-callable',
+        'function.is-countable',
+        'function.is-dir',
+        'function.is-double',
+        'function.is-executable',
+        'function.is-file',
+        'function.is-finite',
+        'function.is-float',
+        'function.is-infinite',
+        'function.is-int',
+        'function.is-integer',
+        'function.is-iterable',
+        'function.is-link',
+        'function.is-long',
+        'function.is-nan',
+        'function.is-null',
+        'function.is-numeric',
+        'function.is-object',
+        'function.is-readable',
+        'function.is-resource',
+        'function.is-scalar',
+        'function.is-string',
+        'function.is-subclass-of',
+        'function.is-uploaded-file',
+        'function.is-writable',
+        'function.is-writeable',
+        'function.iterator-',
+        'function.join',
+        'function.json-',
+        'function.juliantojd',
+        'function.key',
+        'function.key-exists',
+        'function.krsort',
+        'function.ksort',
+        'function.lcfirst',
+        'function.lcg-value',
+        'function.lchgrp',
+        'function.lchown',
+        'function.levenshtein',
+        'function.link',
+        'function.linkinfo',
+        'function.list',
+        'function.localeconv',
+        'function.localtime',
+        'function.log',
+        'function.log10',
+        'function.log1p',
+        'function.long2ip',
+        'function.lstat',
+        'function.ltrim',
+        'function.mail',
+        'function.max',
+        'function.md5',
+        'function.md5-file',
+        'function.memory-',
+        'function.metaphone',
+        'function.method-exists',
+        'function.microtime',
+        'function.mime-content-type',
+        'function.min',
+        'function.mkdir',
+        'function.mktime',
+        'function.money-format',
+        'function.move-uploaded-file',
+        'function.mt-',
+        'function.natcasesort',
+        'function.natsort',
+        'function.net-get-interfaces',
+        'function.next',
+        'function.nl-langinfo',
+        'function.nl2br',
+        'function.number-format',
+        'function.ob-',
+        'function.octdec',
+        'function.opcache-',
+        'function.opendir',
+        'function.openlog',
+        'function.ord',
+        'function.output-',
+        'function.pack',
+        'function.parse-ini-',
+        'function.parse-str',
+        'function.parse-url',
+        'function.passthru',
+        'function.password-',
+        'function.pathinfo',
+        'function.pclose',
+        'function.pfsockopen',
+        'function.php-ini-',
+        'function.php-sapi-name',
+        'function.php-strip-whitespace',
+        'function.php-uname',
+        'function.phpcredits',
+        'function.phpdbg-',
+        'function.phpinfo',
+        'function.phpversion',
+        'function.pi',
+        'function.popen',
+        'function.pos',
+        'function.pow',
+        'function.preg-',
+        'function.prev',
+        'function.print-r',
+        'function.printf',
+        'function.proc-',
+        'function.property-exists',
+        'function.putenv',
+        'function.quoted-printable-',
+        'function.quotemeta',
+        'function.rad2deg',
+        'function.rand',
+        'function.random-',
+        'function.range',
+        'function.rawurldecode',
+        'function.rawurlencode',
+        'function.readdir',
+        'function.readfile',
+        'function.readlink',
+        'function.realpath',
+        'function.realpath-',
+        'function.register-shutdown-function',
+        'function.register-tick-function',
+        'function.rename',
+        'function.reset',
+        'function.restore-',
+        'function.rewind',
+        'function.rewinddir',
+        'function.rmdir',
+        'function.round',
+        'function.rsort',
+        'function.rtrim',
+        'function.sapi-',
+        'function.scandir',
+        'function.seaslog-get-author',
+        'function.seaslog-get-version',
+        'function.serialize',
+        'function.session-',
+        'function.set-',
+        'function.setcookie',
+        'function.setlocale',
+        'function.setrawcookie',
+        'function.settype',
+        'function.sha1',
+        'function.sha1-file',
+        'function.shell-exec',
+        'function.show-source',
+        'function.shuffle',
+        'function.similar-text',
+        'function.sin',
+        'function.sinh',
+        'function.sizeof',
+        'function.sleep',
+        'function.sort',
+        'function.soundex',
+        'function.spl-',
+        'function.sprintf',
+        'function.sqrt',
+        'function.srand',
+        'function.sscanf',
+        'function.stat',
+        'function.str-',
+        'function.strcasecmp',
+        'function.strchr',
+        'function.strcmp',
+        'function.strcoll',
+        'function.strcspn',
+        'function.stream-',
+        'function.strftime',
+        'function.strip-tags',
+        'function.stripcslashes',
+        'function.stripos',
+        'function.stripslashes',
+        'function.stristr',
+        'function.strlen',
+        'function.strnatcasecmp',
+        'function.strnatcmp',
+        'function.strncasecmp',
+        'function.strncmp',
+        'function.strpbrk',
+        'function.strpos',
+        'function.strptime',
+        'function.strrchr',
+        'function.strrev',
+        'function.strripos',
+        'function.strrpos',
+        'function.strspn',
+        'function.strstr',
+        'function.strtok',
+        'function.strtolower',
+        'function.strtotime',
+        'function.strtoupper',
+        'function.strtr',
+        'function.strval',
+        'function.substr',
+        'function.substr-compare',
+        'function.substr-count',
+        'function.substr-replace',
+        'function.symlink',
+        'function.sys-get-temp-dir',
+        'function.sys-getloadavg',
+        'function.syslog',
+        'function.system',
+        'function.tan',
+        'function.tanh',
+        'function.tempnam',
+        'function.time',
+        'function.time-',
+        'function.timezone-',
+        'function.tmpfile',
+        'function.token-get-all',
+        'function.token-name',
+        'function.touch',
+        'function.trait-exists',
+        'function.trigger-error',
+        'function.trim',
+        'function.uasort',
+        'function.ucfirst',
+        'function.ucwords',
+        'function.uksort',
+        'function.umask',
+        'function.uniqid',
+        'function.unlink',
+        'function.unpack',
+        'function.unregister-tick-function',
+        'function.unserialize',
+        'function.unset',
+        'function.urldecode',
+        'function.urlencode',
+        'function.user-error',
+        'function.usleep',
+        'function.usort',
+        'function.var-dump',
+        'function.var-export',
+        'function.version-compare',
+        'function.vfprintf',
+        'function.vprintf',
+        'function.vsprintf',
+        'function.wordwrap',
+        'function.zend-thread-id',
+        'function.zend-version',
+        'pdo.getavailabledrivers',
+    ],
+    'cubrid' => [
+        'function.cubrid-',
+    ],
+    'curl' => [
+        'curlfile.',
+        'function.curl-',
+    ],
+    'dba' => [
+        'function.dba-',
+    ],
+    'dbase' => [
+        'function.dbase-',
+    ],
+    'dio' => [
+        'function.dio-',
+    ],
+    'eio' => [
+        'function.eio-',
+    ],
+    'enchant' => [
+        'function.enchant-',
+    ],
+    'exif' => [
+        'function.exif-',
+        'function.read-exif-',
+    ],
+    'expect' => [
+        'function.expect-',
+    ],
+    'fann' => [
+        'function.fann-',
+    ],
+    'fdf' => [
+        'function.fdf-',
+    ],
+    'fpm' => [
+        'function.fpm-'
+    ],
+    'ftp' => [
+        'function.ftp-',
+    ],
+    'gearman' => [
+        'gearmanclient.',
+        'gearmantask.',
+    ],
+    'gettext' => [
+        'function.bind-textdomain-codeset',
+        'function.bindtextdomain',
+        'function.dcgettext',
+        'function.dcngettext',
+        'function.dgettext',
+        'function.dngettext',
+        'function.gettext',
+        'function.ngettext',
+        'function.textdomain',
+    ],
+    'gd' => [
+        'function.gd-',
+        'function.getimagesize',
+        'function.getimagesizefromstring',
+        'function.image\.+',
+        'function.iptcembed',
+        'function.iptcparse',
+    ],
+    'gmp' => [
+        'function.gmp-',
+    ],
+    'geoip' => [
+        'function.geoip-',
+    ],
+    'gnupg' => [
+        'function.gnupg-',
+    ],
+    'ibase' => [
+        'function.fbird-',
+        'function.ibase-',
+    ],
+    'ibm_db2' => [
+        'function.db2-',
+    ],
+    'iconv' => [
+        'function.iconv',
+        'function.iconv-',
+    ],
+    'igbinary' => [
+        'function.igbinary-',
+    ],
+    'imap' => [
+        'function.imap-',
+    ],
+    'inotify' => [
+        'function.inotify-',
+    ],
+    'intl' => [
+        'collator.',
+        'function.grapheme-',
+        'function.idn-',
+        'function.intl-',
+        'intlcalendar.',
+        'intldateformatter.',
+        'intltimezone.',
+        'locale.',
+        'messageformatter.',
+        'normalizer.',
+        'numberformatter.',
+        'resourcebundle.',
+        'transliterator.',
+    ],
+    'language' => [
+        'function.array',
+        'function.assert',
+        'function.echo',
+        'function.empty',
+        'function.halt-compiler',
+        'function.isset',
+        'function.print',
+    ],
+    'ldap' => [
+        'function.ldap-',
+    ],
+    'libxml' => [
+        'function.libxml-',
+    ],
+    'lzf' => [
+        'function.lzf-',
+    ],
+    'mailparse' => [
+        'function.mailparse-',
+    ],
+    'mbstring' => [
+        'function.mb-',
+    ],
+    'memcache' => [
+        'function.memcache-',
+    ],
+    'mongodb' => [
+        'function.mongodb.',
+    ],
+    'mqseries' => [
+        'function.mqseries-',
+    ],
+    'mysqli' => [
+        'mysqli-',
+        'mysqli.',
+        'function.mysqli-',
+    ],
+    'mysql-obsolete' => [
+        'function.mysql-',
+    ],
+    'oauth' => [
+        'function.oauth-',
+    ],
+    'obsolete_7' => [
+        'function.autoload',
+        'function.end',
+        'function.ezmlm-hash',
+        'function.is-real',
+        'function.jpeg2wbmp',
+        'function.mcrypt-',
+        'function.mdecrypt-',
+        'function.png2wbmp',
+        'function.wddx-',
+    ],
+    'obsolete_8' => [
+        'function.mhash',
+        'function.mhash-',
+        'function.utf8-decode',
+        'function.utf8-encode',
+        'function.zip-',
+    ],
+    'oci8' => [
+        'function.oci\.+',
+    ],
+    'odbc' => [
+        'function.odbc-',
+    ],
+    'openal' => [
+        'function.openal-',
+    ],
+    'openssl' => [
+        'function.openssl-',
+    ],
+    'parallel' => [
+        'parallel.',
+    ],
+    'pcntl' => [
+        'function.pcntl-',
+    ],
+    'pgsql' => [
+        'function.pg-',
+    ],
+    'posix' => [
+        'function.posix-',
+    ],
+    'ps' => [
+        'function.ps-',
+    ],
+    'pspell' => [
+        'function.pspell-',
+    ],
+    'radius' => [
+        'function.radius-',
+    ],
+    'rar' => [
+        'function.rar-',
+        'rararchive.',
+    ],
+    'readline' => [
+        'function.readline',
+        'function.readline-',
+    ],
+    'recode' => [
+        'function.recode',
+        'function.recode-',
+    ],
+    'runkit7' => [
+        'function.runkit7-',
+    ],
+    'rpminfo' => [
+        'function.rpm\.+',
+    ],
+    'rrd' => [
+        'function.rrd-',
+        'function.rrdc-',
+    ],
+    'scoutapm' => [
+        'function.scoutapm-',
+    ],
+    'shmop' => [
+        'function.shmop-',
+    ],
+    'simplexml' => [
+        'function.dom-import-simplexml',
+        'function.simplexml-',
+    ],
+    'sqlsrv' => [
+        'function.sqlsrv-',
+    ],
+    'smnp' => [
+        'function.snmp-',
+        'function.snmp2-',
+        'function.snmp3-',
+        'function.snmp\.+',
+    ],
+    'sodium' => [
+        'function.sodium-',
+    ],
+    'soap' => [
+        'function.is-soap-fault',
+        'function.use-soap-error-handler',
+    ],
+    'socket' => [
+        'function.socket-',
+    ],
+    'solr' => [
+        'function.solr-',
+    ],
+    'ssdeep' => [
+        'function.ssdeep-',
+    ],
+    'ssh2' => [
+        'function.ssh2-',
+    ],
+    'stats' => [
+        'function.stats-',
+    ],
+    'stomp' => [
+        'function.stomp-',
+        'stomp.',
+    ],
+    'svn' => [
+        'function.svn-',
+    ],
+    'swoole' => [
+        'function.swoole-',
+        'swoole-server.',
+    ],
+    'sysvshm' => [
+        'function.ftok',
+        'function.sem-',
+        'function.shm-',
+        'function.msg-get-queue',
+        'function.msg-queue-exists',
+        'function.msg-receive',
+        'function.msg-remove-queue',
+        'function.msg-send',
+        'function.msg-set-queue',
+        'function.msg-stat-queue',
+    ],
+    'taint' => [
+        'function.is-tainted',
+        'function.taint',
+        'function.untaint',
+    ],
+    'tcpwrap' => [
+        'function.tcpwrap-',
+    ],
+    'tidy' => [
+        'function.tidy-',
+        'tidy.',
+    ],
+    'trader' => [
+        'function.trader-',
+    ],
+    'ui' => [
+        'function.ui-',
+    ],
+    'uopz' => [
+        'function.uopz-',
+    ],
+    'var_representation' => [
+        'function.var-representation',
+    ],
+    'win32service' => [
+        'function.win32-',
+    ],
+    'wincache' => [
+        'function.wincache-',
+    ],
+    'xattr' => [
+        'function.xattr-',
+    ],
+    'xdiff' => [
+        'function.xdiff-',
+    ],
+    'xhprof' => [
+        'function.xhprof-',
+    ],
+    'xml' => [
+        'function.xml-',
+    ],
+    'xmlrpc' => [
+        'function.xmlrpc-',
+    ],
+    'xmlwriter' => [
+        'xmlwriter.',
+    ],
+    'yaml' => [
+        'function.yaml-',
+    ],
+    'yaz' => [
+        'function.yaz-',
+    ],
+    'zlib' => [
+        'function.deflate-',
+        'function.gz\.+',
+        'function.inflate-',
+        'function.readgzfile',
+        'function.zlib-',
+    ],
+    'zookeeper' => [
+        'function.zookeeper-',
+    ]
+];
diff --git a/script/extract_functions.php b/script/extract_functions.php
new file mode 100755
index 0000000000..ae3471710e
--- /dev/null
+++ b/script/extract_functions.php
@@ -0,0 +1,111 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * Extract PHP Functions
+ *
+ * @copyright 2022 Friends of Emacs-PHP development
+ * @author USAMI Kenta <tadsan@zonu.me>
+ * @license FSFAP https://spdx.org/licenses/FSFAP.html
+ */
+
+// Copying and distribution of this file, with or without modification,
+// are permitted in any medium without royalty provided the copyright
+// notice and this notice are preserved.  This file is offered as-is,
+// without any warranty.
+
+declare(strict_types=1);
+
+error_reporting(E_ALL);
+
+$functions = json_decode(stream_get_contents(STDIN), true);
+
+$command = $argv[0];
+$subcommand = $argv[1] ?? null;
+
+$subcommands = [
+    'count' => function (array $extracted) {
+        echo json_encode(array_map(count(...), $extracted), 
JSON_PRETTY_PRINT), PHP_EOL;
+    },
+    'modules' => function (array $extracted) {
+        echo implode(PHP_EOL, array_keys($extracted)), PHP_EOL;
+    },
+    'functions' => function (array $extracted) {
+        echo json_encode(array_map(array_keys(...), $extracted), 
JSON_PRETTY_PRINT), PHP_EOL;
+    },
+    'functions-sexp' => function (array $extracted) {
+        echo "  '(";
+        foreach ($extracted as $module => $functions) {
+            echo "\n    ({$module}";
+            //            ksort($functions);
+            foreach ($functions as $name => $function) {
+                $escaped_name = strtr($name, ['\\' => '\\\\']);
+                echo "\n     \"{$escaped_name}\"";
+            }
+            echo ")";
+        }
+        echo ")";
+    },
+];
+
+if (!isset($subcommands[$subcommand])) {
+    $json_url = 'http://doc.php.net/downloads/json/php_manual_en.json';
+    fwrite(STDERR, implode(PHP_EOL, [
+        "[Extract PHP Functions]\n",
+        "This script extract PHP function names from <{$json_url}>.\n",
+        "Usage:",
+        "\t{$command} count < php_manual_en.json",
+        "\t{$command} modules < php_manual_en.json",
+        "\t{$command} functions < php_manual_en.json > result.json",
+        "\t{$command} functions-sexp < php_manual_en.json > result.el",
+        '',
+    ]));
+    exit(1);
+}
+
+$module_id_patterns = array_map(
+    fn($allowlist) => '/\A(?:' . implode('|', array_map(
+        fn($preg) => strtr($preg, ['\.' => '.', '.' => '\.']) .
+            (preg_match('/[0-9a-z]\z/', $preg) ? '\z' : '\b'),
+        $allowlist)
+    ) . ')/',
+    include __DIR__ . '/data/module_id_prefixes.php'
+);
+
+$extracted = [];
+
+foreach ($functions as $name => $function) {
+    if (str_contains($name, '::')) {
+        continue;
+    }
+
+    $module = get_module($function, $module_id_patterns);
+
+    if ($module === null) {
+        fwrite(STDERR, "{$name}: {$function['id']}\n");
+    } else {
+        $extracted[$module][$name] = $function;
+    }
+}
+
+ksort($extracted);
+array_walk($extracted, function (&$functions) {
+    ksort($functions);
+});
+
+call_user_func($subcommands[$subcommand], $extracted);
+
+/**
+ * @param array{id: non-empty-string} $function
+ * @param array<non-empty-string, non-empty-string> $function
+ */
+function get_module(array $function, array $patterns): ?string
+{
+    foreach ($patterns as $module => $pattern) {
+        if (preg_match($pattern, $function['id'])) {
+            return $module;
+        }
+    }
+
+    return null;
+}
diff --git a/script/module_id_prefixes.php b/script/module_id_prefixes.php
new file mode 100644
index 0000000000..4809a9d1cc
--- /dev/null
+++ b/script/module_id_prefixes.php
@@ -0,0 +1,806 @@
+<?php
+
+return [
+    'apache' => [
+        'function.apache-',
+        'function.virtual',
+    ],
+    'apcu' => [
+        'function.apcu-',
+    ],
+    'bcmath' => [
+        'function.bc\.+',
+    ],
+    'bzip2' => [
+        'function.bz\.+',
+    ],
+    'commonmark' => [
+        'function.commonmark-',
+    ],
+    'com_dotnet' => [
+        'function.com-',
+        'function.variant-',
+    ],
+    'componere' => [
+        'componere.',
+    ],
+    'core' => [
+        'function.abs',
+        'function.acos',
+        'function.acosh',
+        'function.addcslashes',
+        'function.addslashes',
+        'function.array-',
+        'function.arsort',
+        'function.asin',
+        'function.asinh',
+        'function.asort',
+        'function.atan',
+        'function.atan2',
+        'function.atanh',
+        'function.base-convert',
+        'function.base64-',
+        'function.basename',
+        'function.bin2hex',
+        'function.bindec',
+        'function.boolval',
+        'function.cal-',
+        'function.call-user-func',
+        'function.call-user-func-array',
+        'function.ceil',
+        'function.chdir',
+        'function.checkdate',
+        'function.checkdnsrr',
+        'function.chgrp',
+        'function.chmod',
+        'function.chop',
+        'function.chown',
+        'function.chr',
+        'function.chroot',
+        'function.chunk-split',
+        'function.class-alias',
+        'function.class-exists',
+        'function.class-implements',
+        'function.class-parents',
+        'function.class-uses',
+        'function.clearstatcache',
+        'function.cli-',
+        'function.closedir',
+        'function.closelog',
+        'function.compact',
+        'function.connection-',
+        'function.constant',
+        'function.convert-cyr-string',
+        'function.convert-uudecode',
+        'function.convert-uuencode',
+        'function.copy',
+        'function.cos',
+        'function.cosh',
+        'function.count',
+        'function.count-chars',
+        'function.crc32',
+        'function.create-function',
+        'function.crypt',
+        'function.ctype-',
+        'function.current',
+        'function.date',
+        'function.debug-',
+        'function.decbin',
+        'function.dechex',
+        'function.decoct',
+        'function.define',
+        'function.defined',
+        'function.deg2rad',
+        'function.delete',
+        'function.die',
+        'function.dir',
+        'function.dirname',
+        'function.disk-',
+        'function.diskfreespace',
+        'function.dl',
+        'function.dns-check-record',
+        'function.dns-get-mx',
+        'function.dns-get-record',
+        'function.dom-import-simplexml',
+        'function.doubleval',
+        'function.each',
+        'function.easter-date',
+        'function.easter-days',
+        'function.enum-exists',
+        'function.error-',
+        'function.escapeshellarg',
+        'function.escapeshellcmd',
+        'function.eval',
+        'function.exec',
+        'function.exit',
+        'function.exp',
+        'function.explode',
+        'function.expm1',
+        'function.extension-loaded',
+        'function.extract',
+        'function.fastcgi-',
+        'function.fclose',
+        'function.fdatasync',
+        'function.fdiv',
+        'function.feof',
+        'function.fflush',
+        'function.fgetc',
+        'function.fgetcsv',
+        'function.fgets',
+        'function.fgetss',
+        'function.file',
+        'function.file\.+',
+        'function.filter-',
+        'function.finfo-',
+        'function.floatval',
+        'function.flock',
+        'function.floor',
+        'function.flush',
+        'function.fmod',
+        'function.fnmatch',
+        'function.fopen',
+        'function.forward-static-call',
+        'function.forward-static-call-array',
+        'function.fpassthru',
+        'function.fprintf',
+        'function.fputcsv',
+        'function.fputs',
+        'function.fread',
+        'function.frenchtojd',
+        'function.fscanf',
+        'function.fseek',
+        'function.fsockopen',
+        'function.fstat',
+        'function.fsync',
+        'function.ftell',
+        'function.ftruncate',
+        'function.func-get-arg',
+        'function.func-get-args',
+        'function.func-num-args',
+        'function.function-exists',
+        'function.fwrite',
+        'function.gc-',
+        'function.get-',
+        'function.getallheaders',
+        'function.getcwd',
+        'function.getdate',
+        'function.getenv',
+        'function.gethostbyaddr',
+        'function.gethostbyname',
+        'function.gethostbynamel',
+        'function.gethostname',
+        'function.getlastmod',
+        'function.getmxrr',
+        'function.getmygid',
+        'function.getmyinode',
+        'function.getmypid',
+        'function.getmyuid',
+        'function.getopt',
+        'function.getprotobyname',
+        'function.getprotobynumber',
+        'function.getrandmax',
+        'function.getrusage',
+        'function.getservbyname',
+        'function.getservbyport',
+        'function.gettimeofday',
+        'function.gettype',
+        'function.glob',
+        'function.gmdate',
+        'function.gmmktime',
+        'function.gmstrftime',
+        'function.gregoriantojd',
+        'function.hash',
+        'function.header',
+        'function.header-register-callback',
+        'function.header-remove',
+        'function.headers-list',
+        'function.headers-sent',
+        'function.hebrev',
+        'function.hebrevc',
+        'function.hex2bin',
+        'function.hexdec',
+        'function.highlight-file',
+        'function.highlight-string',
+        'function.hrtime',
+        'function.html-entity-decode',
+        'function.htmlentities',
+        'function.htmlspecialchars',
+        'function.htmlspecialchars-decode',
+        'function.http-build-query',
+        'function.http-response-code',
+        'function.hypot',
+        'function.idate',
+        'function.ignore-user-abort',
+        'function.implode',
+        'function.in-array',
+        'function.inet-',
+        'function.ini-',
+        'function.intdiv',
+        'function.interface-exists',
+        'function.intval',
+        'function.ip2long',
+        'function.is-a',
+        'function.is-array',
+        'function.is-bool',
+        'function.is-callable',
+        'function.is-countable',
+        'function.is-dir',
+        'function.is-double',
+        'function.is-executable',
+        'function.is-file',
+        'function.is-finite',
+        'function.is-float',
+        'function.is-infinite',
+        'function.is-int',
+        'function.is-integer',
+        'function.is-iterable',
+        'function.is-link',
+        'function.is-long',
+        'function.is-nan',
+        'function.is-null',
+        'function.is-numeric',
+        'function.is-object',
+        'function.is-readable',
+        'function.is-resource',
+        'function.is-scalar',
+        'function.is-string',
+        'function.is-subclass-of',
+        'function.is-uploaded-file',
+        'function.is-writable',
+        'function.is-writeable',
+        'function.iterator-',
+        'function.jddayofweek',
+        'function.jdmonthname',
+        'function.jdtofrench',
+        'function.jdtogregorian',
+        'function.jdtojewish',
+        'function.jdtojulian',
+        'function.jdtounix',
+        'function.jewishtojd',
+        'function.join',
+        'function.json-',
+        'function.juliantojd',
+        'function.key',
+        'function.key-exists',
+        'function.krsort',
+        'function.ksort',
+        'function.lcfirst',
+        'function.lcg-value',
+        'function.lchgrp',
+        'function.lchown',
+        'function.levenshtein',
+        'function.libxml-',
+        'function.link',
+        'function.linkinfo',
+        'function.list',
+        'function.localeconv',
+        'function.localtime',
+        'function.log',
+        'function.log10',
+        'function.log1p',
+        'function.long2ip',
+        'function.lstat',
+        'function.ltrim',
+        'function.mail',
+        'function.max',
+        'function.md5',
+        'function.md5-file',
+        'function.memory-',
+        'function.metaphone',
+        'function.method-exists',
+        'function.microtime',
+        'function.mime-content-type',
+        'function.min',
+        'function.mkdir',
+        'function.mktime',
+        'function.money-format',
+        'function.move-uploaded-file',
+        'function.mt-',
+        'function.natcasesort',
+        'function.natsort',
+        'function.net-get-interfaces',
+        'function.next',
+        'function.nl-langinfo',
+        'function.nl2br',
+        'function.number-format',
+        'function.ob-',
+        'function.octdec',
+        'function.opcache-',
+        'function.opendir',
+        'function.openlog',
+        'function.ord',
+        'function.output-',
+        'function.pack',
+        'function.parse-ini-',
+        'function.parse-str',
+        'function.parse-url',
+        'function.passthru',
+        'function.password-',
+        'function.pathinfo',
+        'function.pclose',
+        'function.pfsockopen',
+        'function.php-ini-',
+        'function.php-sapi-name',
+        'function.php-strip-whitespace',
+        'function.php-uname',
+        'function.phpcredits',
+        'function.phpdbg-',
+        'function.phpinfo',
+        'function.phpversion',
+        'function.pi',
+        'function.popen',
+        'function.pos',
+        'function.posix-',
+        'function.pow',
+        'function.preg-',
+        'function.prev',
+        'function.print-r',
+        'function.printf',
+        'function.proc-',
+        'function.property-exists',
+        'function.putenv',
+        'function.quoted-printable-',
+        'function.quotemeta',
+        'function.rad2deg',
+        'function.rand',
+        'function.random-',
+        'function.range',
+        'function.rawurldecode',
+        'function.rawurlencode',
+        'function.readdir',
+        'function.readfile',
+        'function.readlink',
+        'function.realpath',
+        'function.register-shutdown-function',
+        'function.register-tick-function',
+        'function.rename',
+        'function.reset',
+        'function.restore-',
+        'function.rewind',
+        'function.rewinddir',
+        'function.rmdir',
+        'function.round',
+        'function.rsort',
+        'function.rtrim',
+        'function.sapi-',
+        'function.scandir',
+        'function.seaslog-get-author',
+        'function.seaslog-get-version',
+        'function.serialize',
+        'function.session-',
+        'function.set-',
+        'function.setcookie',
+        'function.setlocale',
+        'function.setrawcookie',
+        'function.settype',
+        'function.sha1',
+        'function.sha1-file',
+        'function.shell-exec',
+        'function.show-source',
+        'function.shuffle',
+        'function.similar-text',
+        'function.simplexml-',
+        'function.sin',
+        'function.sinh',
+        'function.sizeof',
+        'function.sleep',
+        'function.socket-',
+        'function.sodium-',
+        'function.sort',
+        'function.soundex',
+        'function.spl-',
+        'function.sprintf',
+        'function.sqrt',
+        'function.srand',
+        'function.sscanf',
+        'function.stat',
+        'function.str-',
+        'function.strcasecmp',
+        'function.strchr',
+        'function.strcmp',
+        'function.strcoll',
+        'function.strcspn',
+        'function.stream-',
+        'function.strftime',
+        'function.strip-tags',
+        'function.stripcslashes',
+        'function.stripos',
+        'function.stripslashes',
+        'function.stristr',
+        'function.strlen',
+        'function.strnatcasecmp',
+        'function.strnatcmp',
+        'function.strncasecmp',
+        'function.strncmp',
+        'function.strpbrk',
+        'function.strpos',
+        'function.strptime',
+        'function.strrchr',
+        'function.strrev',
+        'function.strripos',
+        'function.strrpos',
+        'function.strspn',
+        'function.strstr',
+        'function.strtok',
+        'function.strtolower',
+        'function.strtotime',
+        'function.strtoupper',
+        'function.strtr',
+        'function.strval',
+        'function.substr',
+        'function.substr-compare',
+        'function.substr-count',
+        'function.substr-replace',
+        'function.symlink',
+        'function.sys-get-temp-dir',
+        'function.sys-getloadavg',
+        'function.syslog',
+        'function.system',
+        'function.tan',
+        'function.tanh',
+        'function.tempnam',
+        'function.time',
+        'function.timezone-',
+        'function.tmpfile',
+        'function.token-get-all',
+        'function.token-name',
+        'function.touch',
+        'function.trait-exists',
+        'function.trigger-error',
+        'function.trim',
+        'function.uasort',
+        'function.ucfirst',
+        'function.ucwords',
+        'function.uksort',
+        'function.umask',
+        'function.uniqid',
+        'function.unixtojd',
+        'function.unlink',
+        'function.unpack',
+        'function.unregister-tick-function',
+        'function.unserialize',
+        'function.unset',
+        'function.urldecode',
+        'function.urlencode',
+        'function.user-error',
+        'function.usleep',
+        'function.usort',
+        'function.var-dump',
+        'function.var-export',
+        'function.version-compare',
+        'function.vfprintf',
+        'function.vprintf',
+        'function.vsprintf',
+        'function.wordwrap',
+        'function.xml-',
+        'function.zend-thread-id',
+        'function.zend-version',
+        'pdo.getavailabledrivers',
+        'xmlwriter.',
+    ],
+    'cubrid' => [
+        'function.cubrid-',
+    ],
+    'curl' => [
+        'curlfile.',
+        'function.curl-',
+    ],
+    'dba' => [
+        'function.dba-',
+    ],
+    'dbase' => [
+        'function.dbase-',
+    ],
+    'dio' => [
+        'function.dio-',
+    ],
+    'eio' => [
+        'function.eio-',
+    ],
+    'enchant' => [
+        'function.enchant-',
+    ],
+    'exif' => [
+        'function.exif-',
+        'function.read-exif-',
+    ],
+    'expect' => [
+        'function.expect-',
+    ],
+    'fann' => [
+        'function.fann-',
+    ],
+    'fdf' => [
+        'function.fdf-',
+    ],
+    'fpm' => [
+        'function.fpm-'
+    ],
+    'ftp' => [
+        'function.ftp-',
+    ],
+    'gearman' => [
+        'gearmanclient.',
+        'gearmantask.',
+    ],
+    'gettext' => [
+        'function.bind-textdomain-codeset',
+        'function.bindtextdomain',
+        'function.dcgettext',
+        'function.dcngettext',
+        'function.dgettext',
+        'function.dngettext',
+        'function.gettext',
+        'function.ngettext',
+        'function.textdomain',
+    ],
+    'gd' => [
+        'function.gd-',
+        'function.getimagesize',
+        'function.getimagesizefromstring',
+        'function.image\.+',
+        'function.iptcembed',
+        'function.iptcparse',
+    ],
+    'gmp' => [
+        'function.gmp-',
+    ],
+    'geoip' => [
+        'function.geoip-',
+    ],
+    'gnupg' => [
+        'function.gnupg-',
+    ],
+    'ibase' => [
+        'function.fbird-',
+        'function.ibase-',
+    ],
+    'ibm_db2' => [
+        'function.db2-',
+    ],
+    'iconv' => [
+        'function.iconv',
+    ],
+    'igbinary' => [
+        'function.igbinary-',
+    ],
+    'imap' => [
+        'function.imap-',
+    ],
+    'inotify' => [
+        'function.inotify-',
+    ],
+    'intl' => [
+        'collator.',
+        'function.grapheme-',
+        'function.idn-',
+        'function.intl-',
+        'intlcalendar.',
+        'intldateformatter.',
+        'intltimezone.',
+        'locale.',
+        'messageformatter.',
+        'normalizer.',
+        'numberformatter.',
+        'resourcebundle.',
+        'transliterator.',
+    ],
+    'language' => [
+        'function.array\z',
+        'function.assert',
+        'function.echo',
+        'function.empty',
+        'function.halt-compiler',
+        'function.isset',
+        'function.print\z',
+    ],
+    'ldap' => [
+        'function.ldap-',
+    ],
+    'lzf' => [
+        'function.lzf-',
+    ],
+    'mailparse' => [
+        'function.mailparse-',
+    ],
+    'mbstring' => [
+        'function.mb-',
+    ],
+    'memcache' => [
+        'function.memcache-',
+    ],
+    'mongodb' => [
+        'function.mongodb.',
+    ],
+    'mqseries' => [
+        'function.mqseries-',
+    ],
+    'mysqli' => [
+        'mysqli-',
+        'mysqli.',
+        'function.mysqli-',
+    ],
+    'mysql-obsolete' => [
+        'function.mysql-',
+    ],
+    'oauth' => [
+        'function.oauth-',
+    ],
+    'obsolete_7' => [
+        'function.autoload',
+        'function.end',
+        'function.ezmlm-hash',
+        'function.is-real',
+        'function.jpeg2wbmp',
+        'function.mcrypt-',
+        'function.mdecrypt-',
+        'function.png2wbmp',
+        'function.wddx-',
+    ],
+    'obsolete_8' => [
+        'function.mhash',
+        'function.utf8-decode',
+        'function.utf8-encode',
+        'function.zip-',
+    ],
+    'oci8' => [
+        'function.oci\.+',
+    ],
+    'odbc' => [
+        'function.odbc-',
+    ],
+    'openal' => [
+        'function.openal-',
+    ],
+    'openssl' => [
+        'function.openssl-',
+    ],
+    'parallel' => [
+        'parallel.',
+    ],
+    'pcntl' => [
+        'function.pcntl-',
+    ],
+    'pgsql' => [
+        'function.pg-',
+    ],
+    'ps' => [
+        'function.ps-',
+    ],
+    'pspell' => [
+        'function.pspell-',
+    ],
+    'radius' => [
+        'function.radius-',
+    ],
+    'rar' => [
+        'function.rar-',
+        'rararchive.',
+    ],
+    'readline' => [
+        'function.readline',
+    ],
+    'recode' => [
+        'function.recode',
+    ],
+    'runkit7' => [
+        'function.runkit7-',
+    ],
+    'rpminfo' => [
+        'function.rpm\.+',
+    ],
+    'rrd' => [
+        'function.rrd-',
+        'function.rrdc-',
+    ],
+    'scoutapm' => [
+        'function.scoutapm-',
+    ],
+    'shmop' => [
+        'function.shmop-',
+    ],
+    'sqlsrv' => [
+        'function.sqlsrv-',
+    ],
+    'smnp' => [
+        'function.snmp-',
+        'function.snmp2-',
+        'function.snmp3-',
+        'function.snmp\.+',
+    ],
+    'soap' => [
+        'function.is-soap-fault',
+        'function.use-soap-error-handler',
+    ],
+    'solr' => [
+        'function.solr-',
+    ],
+    'ssdeep' => [
+        'function.ssdeep-',
+    ],
+    'ssh2' => [
+        'function.ssh2-',
+    ],
+    'stats' => [
+        'function.stats-',
+    ],
+    'stomp' => [
+        'function.stomp-',
+        'stomp.',
+    ],
+    'svn' => [
+        'function.svn-',
+    ],
+    'swoole' => [
+        'function.swoole-',
+        'swoole-server.',
+    ],
+    'sysvshm' => [
+        'function.ftok',
+        'function.sem-',
+        'function.shm-',
+        'function.msg-get-queue',
+        'function.msg-queue-exists',
+        'function.msg-receive',
+        'function.msg-remove-queue',
+        'function.msg-send',
+        'function.msg-set-queue',
+        'function.msg-stat-queue',
+    ],
+    'taint' => [
+        'function.is-tainted',
+        'function.taint',
+        'function.untaint',
+    ],
+    'tcpwrap' => [
+        'function.tcpwrap-',
+    ],
+    'tidy' => [
+        'function.tidy-',
+        'tidy.',
+    ],
+    'trader' => [
+        'function.trader-',
+    ],
+    'ui' => [
+        'function.ui-',
+    ],
+    'uopz' => [
+        'function.uopz-',
+    ],
+    'var_representation' => [
+        'function.var-representation',
+    ],
+    'win32service' => [
+        'function.win32-',
+    ],
+    'wincache' => [
+        'function.wincache-',
+    ],
+    'xattr' => [
+        'function.xattr-',
+    ],
+    'xdiff' => [
+        'function.xdiff-',
+    ],
+    'xhprof' => [
+        'function.xhprof-',
+    ],
+    'xmlrpc' => ['function.xmlrpc-'],
+    'yaml' => [
+        'function.yaml-',
+    ],
+    'yaz' => [
+        'function.yaz-',
+    ],
+    'zlib' => [
+        'function.deflate-',
+        'function.gz\.+',
+        'function.inflate-',
+        'function.readgzfile',
+        'function.zlib-',
+    ],
+    'zookeeper' => [
+        'function.zookeeper-',
+    ]
+];



reply via email to

[Prev in Thread] Current Thread [Next in Thread]